perm filename DLNSER.XGP[DLN,MRC] blob sn#374131 filedate 1978-08-14 generic text, type T, neo UTF8
/FONT#0=FIX20.FNT[XGP,SYS]
/BMAR=1
/TMAR=128
/RMAR=1699
/LMAR=128
/PMAR=2065
/XLINE=4
SAIL MRC        09:05:10 Monday, August 14, 1978   FQ+3D.9H.17M.15S.
DLNSER[S,SYS] Created 17:03 Sunday, August 13, 1978   FQ+2D.17H.15M.5S.

DDDDDDDDD            LLL                  NNN         NNN         SSSSSSSSS         EEEEEEEEEEEEEEE      RRRRRRRRRRRR   
DDDDDDDDD            LLL                  NNN         NNN         SSSSSSSSS         EEEEEEEEEEEEEEE      RRRRRRRRRRRR   
DDDDDDDDD            LLL                  NNN         NNN         SSSSSSSSS         EEEEEEEEEEEEEEE      RRRRRRRRRRRR   
DDD      DDD         LLL                  NNNNNN      NNN      SSS         SSS      EEE                  RRR         RRR
DDD      DDD         LLL                  NNNNNN      NNN      SSS         SSS      EEE                  RRR         RRR
DDD      DDD         LLL                  NNNNNN      NNN      SSS         SSS      EEE                  RRR         RRR
DDD         DDD      LLL                  NNN   NNN   NNN      SSS                  EEE                  RRR         RRR
DDD         DDD      LLL                  NNN   NNN   NNN      SSS                  EEE                  RRR         RRR
DDD         DDD      LLL                  NNN   NNN   NNN      SSS                  EEE                  RRR         RRR
DDD         DDD      LLL                  NNN      NNNNNN         SSSSSSSSS         EEEEEEEEEEEE         RRRRRRRRRRRR   
DDD         DDD      LLL                  NNN      NNNNNN         SSSSSSSSS         EEEEEEEEEEEE         RRRRRRRRRRRR   
DDD         DDD      LLL                  NNN      NNNNNN         SSSSSSSSS         EEEEEEEEEEEE         RRRRRRRRRRRR   
DDD         DDD      LLL                  NNN         NNN                  SSS      EEE                  RRR   RRR      
DDD         DDD      LLL                  NNN         NNN                  SSS      EEE                  RRR   RRR      
DDD         DDD      LLL                  NNN         NNN                  SSS      EEE                  RRR   RRR      
DDD      DDD         LLL                  NNN         NNN      SSS         SSS      EEE                  RRR      RRR   
DDD      DDD         LLL                  NNN         NNN      SSS         SSS      EEE                  RRR      RRR   
DDD      DDD         LLL                  NNN         NNN      SSS         SSS      EEE                  RRR      RRR   
DDDDDDDDD            LLLLLLLLLLLLLLL      NNN         NNN         SSSSSSSSS         EEEEEEEEEEEEEEE      RRR         RRR
DDDDDDDDD            LLLLLLLLLLLLLLL      NNN         NNN         SSSSSSSSS         EEEEEEEEEEEEEEE      RRR         RRR
DDDDDDDDD            LLLLLLLLLLLLLLL      NNN         NNN         SSSSSSSSS         EEEEEEEEEEEEEEE      RRR         RRR

SAIL MRC        09:05:10 Monday, August 14, 1978   FQ+3D.9H.17M.15S.
DLNSER[S,SYS] Created 17:03 Sunday, August 13, 1978   FQ+2D.17H.15M.5S.

               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

DLNSER[S,SYS]          DLNDDB[S,SYS]


Switch Settings: L[FAIL] % C S 78V 120W X ↑ 
Fonts: F[FIX20.FNT[XGP,SYS],,] 

␈↓&	                                                                 DLNSER[S,SYS] 08/14/78  Page 1␈↓'α
  001                   COMMENT ⊗   VALID 00030 PAGES
  002                   C REC  PAGE   DESCRIPTION
  003                   C00001 00001
  004                   C00004 00002	BEGIN DLNSER ↔ SUBTTL DLNSER Dialnet device service routines
  005                   C00006 00003	DLNMSG
  006                   C00008 00004	PKTCOP PKTCHN PKTOPC PKTSEQ PKTACK PKTSIZ PKTDAT PKTFDA PKTSDA PKTWNS
  007                   C00012 00005	PDBGET MAKPDB MAKPD1 MAKPD2 PDFILL REPFPL REPFLX
  008                   C00015 00006	CLRPDB FLSPDB
  009                   C00017 00007	DLNINI DLNIN1 DLNRLS DLDINI
  010                   C00020 00008	DLNINP DLILUP DLIDSC UUOTAB
  011                   C00023 00009	DLIMSG DLMLUP DLICLS DLIINR DLIEOF
  012                   C00026 00010	DLNOUT DLONEW DLOOLD DLOLUP DLOOUT DLOOUX
  013                   C00030 00011	DLNMTP DLNMDS
  014                   C00031 00012	DLNRPC DLRCON
  015                   C00034 00013	SNDNOP DLNRPA DLNRWN
  016                   C00036 00014	DLNCLS DLNWIN DLNEOF
  017                   C00039 00015	DLNINT DLNSTA DLNCWA
  018                   C00042 00016	DXHANG DLHANG DCWAIT DLWAIT DCWAKE DLWAKE
  019                   C00045 00017	GETARG NORPC DCHLUZ DLOUTQ DLOUQ1
  020                   C00048 00018	DLNCLK DLNCL1 DLNCL2
  021                   C00051 00019	RDPCKT RDPCKX RDPDAT
  022                   C00054 00020	RDPDUN RDPSIW RDPFAK RDPCKN RDPNRT
  023                   C00057 00021	RDPPAK RDPNPK RDPPK0 RDPNOP INTTAB
  024                   C00060 00022	RDPMSG RDPWIN RDPWN1 RDPINT RDPNAK REVPDB RDPERR
  025                   C00064 00023	RDPRPC RDRPC2 RDPCLS RDPCL1
  026                   C00067 00024	WRLIST WRLSTX WRPSOP
  027                   C00070 00025	WRPDAT WRPMOR WRPBKU
  028                   C00073 00026	DLNICH DLNOCH DLNOC1 DLNRCH DLNDIL DLNLGR CHKBYT
  029                   C00076 00027	SNDERR SNDERL SNDER1
  030                   C00078 00028	DLIINT DLOINT
  031                   C00081 00029	DLPINT DLHINT
  032                   C00083 00030	DLNBUG BADDLU
  033                   C00085 ENDMK
  034                   C⊗;
␈↓&	                                                                 DLNSER[S,SYS] 08/14/78  Page 2␈↓'α
  001                   BEGIN DLNSER ↔ SUBTTL DLNSER Dialnet device service routines
  002                   ; Mark Crispin, August '78
  003                   
  004                   ; Aren't you glad you use Dialnet?  Don't you wish everybody did?
  005                   
  006                   IFN FTDLN,<
  007                   
  008                   IFE FTDCA,<.FATAL FTDLN requires FTDCA>
  009                   
  010                   HISYS
  011                   
  012                   ; UUO dispatch table.  I said it wasn't a standard device!
  013                   
  014          007 007  	JRST DLNINI		; initialize
  015                   	POPJ P,			; hung timeout(?)
  016          007 028  ↑DLNDSP:JRST DLNRLS		; RELEASE
  017          014 010  	JRST DLNCLS		; CLOSE output
  018                   	JRST UUOERR		; OUTPUT (can't happen)
  019                   	JRST UUOERR		; INPUT (can't happen)
  020                   	JRST UUOERR		; ENTER
  021                   	JRST UUOERR		; LOOKUP
  022          010 012  	JRST DLNOUT		; dump mode OUTPUT
  023          008 016  	JRST DLNINP		; dump mode INPUT
  024                   	JRST UUOERR		; USETO
  025                   	JRST UUOERR		; USETI
  026                   	JRST UUOERR		; UGETF
  027                   	JRST UUOERR		; RENAME
  028                   	POPJ P,			; CLOSE input (no-op)
  029                   	JRST UUOERR		; UTPCLR
  030          011 005  	JRST DLNMTP		; MTAPE
␈↓&	                                                                 DLNSER[S,SYS] 08/14/78  Page 3␈↓'α
  001                   ;DLNMSG
  002                   
  003                   ;  Macro to generate a CTY message logging an interesting occurance
  004                   ; First argument is the message to be typed out; second is a one-byte
  005                   ; datum, third is an address of a byte pointer to a message which is
  006                   ; to be typed out in ASCII.  This is intended for ERRs with string
  007                   ; messages.  If this option is used the macro call must NOT be in
  008                   ; a literal!!
  009                   
  010                   DEFINE DLNMSG (MESS,WD,PNTR) <
  011                   	PUSHACS
  012                   IFDIF <WD><>,<PUSH P,WD>
  013                   	LDB TAC,PUNIT
  014                   	PUSH P,TAC
  015                   	PUSHJ P,DISERR
  016                   	 [ASCIZ/DLN/]
  017                   	 DISARG LOC,<-1(P)>
  018                   	 [ASCIZ/: MESS/]
  019                   	 IFDIF <WD><>,<[ASCIZ/, Data /] ↔ DISARG LOC,<-2(P)>>
  020                   	 [ASCIZ/  /]
  021                   	 -1
  022                   	ADJSP P,IFIDN <WD><><-1;>-2
  023                   IFDIF <PNTR><>,<
  024          004 047  	MOVE PDB,-17+PDB(P)
  025                   	SKIPA AC2,PNTR
  026                   	 PUSHJ P,DISTYO
  027                   	ILDB CHR,AC2
  028                   	JUMPN CHR,.-2
  029                   	PUSHJ P,DISMES
  030                   	 ASCIZ/  /
  031                   >;IFDIF
  032                   	PUSHJ P,DISDATE
  033                   	POPACS
  034                   >;DEFINE DLNMSG
␈↓&	Dialnet definitions                                              DLNSER[S,SYS] 08/14/78  Page 4␈↓'α
  001                   ;PKTCOP PKTCHN PKTOPC PKTSEQ PKTACK PKTSIZ PKTDAT PKTFDA PKTSDA PKTWNS
  002                   
  003                   SUBTTL Dialnet definitions
  004                   
  005                   ; ASCII definitions
  006                   
  007                   %DLE←←220			; Data Link Escape
  008                   %STX←←202			; Start of TeXt
  009                   %ETX←←203			; End of TeXt
  010                   
  011          004 009  IFN %ETX-<%STX+1>,<.FATAL DLNSER knows that %STX=%ETX+1>
  012                   
  013                   ; Op code definitions
  014                   
  015                   %NOP←←00			; No-OPeration
  016                   %RPC←←01			; Request Process Connection
  017                   %CLS←←02			; CLoSe process connection
  018                   %WIN←←03			; WINdow size
  019                   %MSG←←04			; MeSsaGe
  020                   %NAK←←05			; Negative AcKnowledge
  021                   %EOF←←06			; End Of File
  022                   %INT←←07			; INTerrupt
  023                   %ERR←←10			; ERRor
  024                   
  025          002 001  IFN %NOP,<.FATAL DLNSER knows that %NOP=0>
  026                   
  027                   ; Window size definitions, used for # of PDB's to allocate
  028                   
  029                   ↑WINMIN←←=2			; must be at least two windows
  030                   ↑WINDEF←←=5			; default to 5 windows
  031                   ↑WINMAX←←=16			; limit of 16. windows
  032                   
  033                   ; Bits in DSTAT word of the DDB
  034                   
  035                   DS%CON←←1			; 1.1 → Connection open
  036                   DS%IEN←←2			; 1.2 → I-level enabled
  037                   DS%IDL←←4			; 1.3 → Output idle
  038                   DS%DLE←←10			; 1.4 → DLE seen at DLIINT
  039                   DS%EOP←←20			; 1.5 → RDPDUN to be run at EOP
  040                   DS%CCR←←40			; 1.6 → carrier detect on this line
  041                   DS%ACN←←100			; 1.7 → need to send acknowledgement
  042                   DS%ODE←←200			; 1.8 → need to output an additional DLE
  043                   
  044                   ;  PDB definitions.  Note that PDB's are in a two-way linked-list in DILIST,
  045                   ; DOLIST, and DXLIST, but only a one-way list in PDBFL.
  046                   
  047                   PDB←←AC1			; AC to use as PDB pointer (must be AC1)
  048                   
  049                   PDBLNK←←0			; previous PDB,,next PDB (must be first in the PDB)
  050          004 049  PDBCNT←←PDBLNK+1		; PDB I/O counter
  051          004 050  PDBPNT←←PDBCNT+1		; PDB I/O pointer
  052          004 051  PDBCHK←←PDBPNT+1		; packet checksum
  053          004 052  PDBHDR←←PDBCHK+1		; packet header, start of real packet
  054          004 053  PDBDAT←←PDBHDR+1		; first word of data
  055          004 054  PDBSIZ←←PDBDAT+100		; size of PDB
  056                   
  057                   ; Pointers for snarfing things in the packet
  058                   
  059          004 047  PKTCOP:	331100,,PDBHDR(PDB)	; channel/op code
  060          004 047  PKTCHN:	370500,,PDBHDR(PDB)	; channel
  061          004 047  PKTOPC:	330400,,PDBHDR(PDB)	; op code
  062          004 047  PKTSEQ:	221100,,PDBHDR(PDB)	; sequence number
  063          004 047  PKTACK:	111100,,PDBHDR(PDB)	; acknowledgement
  064          004 047  PKTSIZ:	001100,,PDBHDR(PDB)	; packet data size -1
  065                   
  066          004 047  PKTDAT:	441100,,PDBDAT(PDB)	; ILDB/IDPB pointer to data area
  067          004 047  PKTFDA:	331100,,PDBDAT(PDB)	; first word in data area
  068          004 047  PKTSDA:	221100,,PDBDAT(PDB)	; second word in data area
  069                   
  070          004 047  PKTWNS:	331100,,PDBDAT+2(PDB)	; pointer to window size in RPC
␈↓&	Memory manglers                                                  DLNSER[S,SYS] 08/14/78  Page 5␈↓'α
  001                   ;PDBGET MAKPDB MAKPD1 MAKPD2 PDFILL REPFPL REPFLX
  002                   
  003                   SUBTTL Memory manglers
  004                   
  005                   ; PDBGET gets a PDB from free storage and clears it
  006                   ;	PUSHJ P,PDBGET
  007                   ;	 <no core>
  008                   ;	<return, PDB pointer in PDB>
  009                   
  010          004 055  PDBGET:	MOVEI AC3,PDBSIZ
  011                   	PUSHJ P,FSGET		; ask FS mangler for core
  012                   	 POPJ P,		; lost
  013          004 047  	SETZM (PDB)		; clear PDB we got
  014          004 047  	HRLI TAC,(PDB)
  015          004 047  	HRRI TAC,1(PDB)
  016          004 047  	BLT TAC,PDBSIZ-1(PDB)
  017                   	JRST CPOPJ1
  018                   
  019                   ;  MAKPDB gets a PDB from free list or free storage.  Note that the free
  020                   ; list is only lunk one-way (sigh).
  021                   ;	PUSHJ P,MAKPDB
  022                   ;	 <no core>
  023                   ;	<return, PDB pointer in PDB>
  024                   
  025                   MAKPDB:	CONO PI,SCNOFF
  026  DLNDDB  002 061  	SKIPN PDB,PDBFL		; get a PDB off the free list
  027                   	 JRST [	CONO PI,SCNON
  028          005 010  		PUSHJ P,PDBGET	; no list, try free storage
  029                   		 POPJ P,
  030  DLNDDB  002 062  		SKIPL PDBFLN	; need to replenish?
  031                   		 JRST CPOPJ1	; no, just return
  032          005 043  		JRST PDFILL]
  033  DLNDDB  002 061  	MOVEI TAC1,PDBFL	; since one way, have to remember the previous
  034          004 047  MAKPD1:	SKIPN TAC,(PDB)		; try to find the last on the list
  035          005 039  	 JRST MAKPD2		; found it, exit the loop
  036          004 047  	MOVEI TAC1,(PDB)	; remember the previous
  037          004 047  	MOVEI PDB,(TAC)		; now get the current
  038          005 034  	JRST MAKPD1		; continue running down the list
  039                   MAKPD2:	SETZM (TAC1)		; remove it from the free list
  040                   	CONO PI,SCNON
  041  DLNDDB  002 062  	SOSL PDBFLN
  042                   	 JRST CPOPJ1		; free list filled or bloated, all done
  043          004 047  PDFILL:	PUSH P,PDB		; save PDB we're really going to use
  044          005 050  	PUSHJ P,REPFPL		; try to replenish free PDB list
  045          004 047  	POP P,PDB		; restore real PDB
  046                   	JRST CPOPJ1
  047                   
  048                   ; Here to replenish free PDB list
  049                   
  050          005 010  REPFPL:	PUSHJ P,PDBGET
  051                   	 JRST [	MOVSI TAC,REPFPL; can't get one, put in a clock request
  052                   		CONO PI,PIOFF	; to try again next tick
  053                   		IDPB TAC,CLKQ
  054                   		CONO PI,PION
  055                   		POPJ P,]
  056                   REPFLX:	CONO PI,SCNOFF		; here from CLRPDB with new PDB on stack
  057  DLNDDB  002 061  	EXCH PDB,PDBFL		; PDBFL ← new, PDB ← old
  058  DLNDDB  002 061  	MOVEM PDB,@PDBFL	; tack on rest of the list
  059                   	CONO PI,SCNON
  060  DLNDDB  002 062  	AOSGE PDBFLN		; note one less block needed
  061          005 050  	 JRST REPFPL		; still more to do
  062                   	POPJ P,
␈↓&	Memory manglers                                                  DLNSER[S,SYS] 08/14/78  Page 6␈↓'α
  001                   ;CLRPDB FLSPDB
  002                   
  003                   ;  CLRPDB returns a PDB to free storage, points PDB at the next.  Barfs if
  004                   ; there was a previous to this PDB.
  005                   ;	MOVEI PDB,<addr of PDB to release>
  006                   ;	PUSHJ P,CLRPDB
  007                   ;	<return, new PDB addr in PDB>
  008                   
  009          004 047  CLRPDB:	TLNE PDB,-1
  010          030 010  	 PUSHJ P,DLNBUG		; PDB should be remotely reasonable
  011          004 047  	SKIPN PDB
  012          030 010  	 PUSHJ P,DLNBUG
  013                   	CONO PI,SCNOFF
  014          004 047  	MOVE TAC,(PDB)
  015                   	TLNE TAC,-1		; barf if there was a previous
  016          030 010  	 PUSHJ P,DLNBUG
  017                   	SKIPE TAC		; if it was in a list
  018                   	 HRRZS (TAC)		; unlink it from the list
  019                   	CONO PI,SCNON
  020                   	PUSH P,TAC		; put new one on stack
  021  DLNDDB  002 062  	SKIPL PDBFLN		; does the free list want any?
  022                   	 JRST [	PUSHJ P,FSGIVE	; no, give it back
  023          004 047  		POP P,PDB
  024                   		POPJ P,]
  025                   
  026                   ;  Here if the list wants some more PDB's, give this one to it and try to
  027                   ; replenish it while we're at it.
  028                   
  029          004 047  	SETZM (PDB)		; PDBFL wants some, clear out old cruft
  030          004 047  	HRLI TAC,(PDB)
  031          004 047  	HRRI TAC,1(PDB)
  032          004 047  	BLT TAC,PDBSIZ-1(PDB)
  033          005 056  	PUSHJ P,REPFLX		; call the replenisher at special entry point
  034          004 047  	POP P,PDB
  035                   	POPJ P,
  036                   
  037                   ; Here to release a PDB list.  I-level must be disabled.
  038                   
  039          004 047  FLSPDB:	HLRZ TAC,(PDB)		; run down list until find the first
  040          006 039  	JUMPN TAC,[MOVEI PDB,(TAC) ↔ JRST FLSPDB]
  041          006 009  	PUSHJ P,CLRPDB		; and flush the entire list
  042          004 047  	JUMPN PDB,.-1
  043                   	POPJ P,
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 7␈↓'α
  001                   ;DLNINI DLNIN1 DLNRLS DLDINI
  002                   
  003                   SUBTTL UUO routines
  004                   
  005                   ; System initialization
  006                   
  007                   DLNINI:	MOVNI TAC,DLNNUM	; one spare for each port
  008  DLNDDB  002 062  	MOVEM TAC,PDBFLN
  009          005 025  	PUSHJ P,MAKPDB		; make an initial PDB
  010          030 010  	 PUSHJ P,DLNBUG		; no core at system initialization time?
  011          006 009  	PUSHJ P,CLRPDB		; free it (didn't really want it to begin with)
  012                   	PUSH P,DDB		; I'm paranoid
  013                   	MOVSI TAC,-DLNNUM
  014  DLNDDB  002 057  DLNIN1:	MOVE DDB,DLNUTB(TAC)	; get DDB for this unit
  015                   	PUSH P,TAC
  016          007 043  	PUSHJ P,DLDINI		; initialize the DDB
  017                   	POP P,TAC
  018          007 014  	AOBJN TAC,DLNIN1	; loop through for each DDB
  019                   	POP P,DDB
  020          018 010  	MOVE TAC,[DLNCLK,,5*JIFSEC] ; every 5 seconds
  021                   	CONO PI,PIOFF
  022                   	IDPB TAC,CLOCK(PID)	; we have a checkpoint
  023                   	CONO PI,PION
  024                   	POPJ P,
  025                   
  026                   ; RELEASE UUO
  027                   
  028  DLNDDB  002 030  DLNRLS:	SETZM DSTAT(DDB)	; clear DS%IEN bit to turn off I-level
  029  DLNDDB  002 038  	SKIPE PDB,DILIST(DDB)	; flush input list
  030          006 039  	 PUSHJ P,FLSPDB
  031  DLNDDB  002 039  	SKIPE PDB,DOLIST(DDB)	; and output list
  032          006 039  	 PUSHJ P,FLSPDB
  033  DLNDDB  002 040  	SKIPE PDB,DXLIST(DDB)	; and pending acknowledgement list
  034          006 039  	 PUSHJ P,FLSPDB
  035  DLNDDB  002 036  	SKIPE PDB,UUOPDB(DDB)	; flush UUO PDB if any
  036          006 009  	 PUSHJ P,CLRPDB
  037  DLNDDB  002 037  	SKIPE PDB,INTPDB(DDB)	; ditto for interrupt PDB's
  038          006 009  	 PUSHJ P,CLRPDB
  039                   ;	JRST DLDINI		; now init the DDB
  040                   
  041                   ; Here to initialize a DDB and the DDB's port
  042                   
  043                   DLDINI:	LDB TAC,PUNIT
  044                   	PUSHJ P,DLNHNG		; hang up the modem
  045                   	LDB TAC,PUNIT
  046                   	LSH TAC,=12
  047                   	IOR TAC,[DLNPKU,,5*JIFSEC] ; enable DTR after 5 seconds
  048                   	CONO PI,PIOFF
  049                   	IDPB TAC,CLOCK(PID)
  050                   	CONO PI,PION
  051  DLNDDB  002 029  	SETZM DFWC(DDB)		; clear DDB
  052  DLNDDB  002 029  	HRLI TAC,DFWC(DDB)
  053  DLNDDB  002 029  	HRRI TAC,DFWC+1(DDB)
  054  DLNDDB  002 048  	BLT TAC,DLWC(DDB)
  055                   	SETZM DEVIOS(DDB)	; clear IOS
  056          004 029  	MOVEI TAC,WINMIN	; set up minimum window size
  057          004 029  	MOVEI TAC1,WINMIN
  058  DLNDDB  002 034  	DMOVEM TAC,DIWS(DDB)
  059  DLNDDB  002 041  	DMOVEM TAC,DIWIN(DDB)
  060                   	MOVEI TAC,CPOPJ		; output interrupt dispatch
  061  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  062  DLNDDB  002 032  	MOVEM TAC,DODS(DDB)
  063          004 037  	MOVEI TAC,DS%IEN!DS%IDL	; flag output I-level as idle and
  064  DLNDDB  002 030  	MOVEM TAC,DSTAT(DDB)	; allow I-level to work again
  065                   	POPJ P,
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 8␈↓'α
  001                   ;DLNINP DLILUP DLIDSC UUOTAB
  002                   
  003                   ; INPUT UUO and UUO-level opcode processing
  004                   ;
  005                   ; Receive data
  006                   ;	INPUT chn,block
  007                   ;	...
  008                   ; block:byte pointer to data buffer
  009                   ;	number of data bytes
  010                   ;	data channel
  011                   ;
  012                   ;  Also handle command packets which should be processed in the data stream.
  013                   ; This includes things like EOF, or CLS, which are conditions which want to
  014                   ; be raised only after previous packets have been processed.
  015                   
  016          004 035  DLNINP:	MOVEI TAC,DS%CON
  017  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; insist on open connection
  018          017 016  	 JRST NORPC
  019          017 006  	PUSHJ P,GETARG		; snarf user args
  020                   	JUMPLE AC2,CPOPJ
  021                   	XCTR XRW,[MOVES 2(UUO)]	; check channel writeability
  022  DLNDDB  002 038  DLILUP:	SKIPN PDB,DILIST(DDB)	; get PDB from the list
  023          016 013  	 PUSHJ P,DLHANG
  024          004 061  	LDB TAC,PKTOPC
  025          008 049  	CAIGE TAC,OPMAX		; legal opcode?
  026          008 040  	 XCT UUOTAB(TAC)	; yes, dispatch to appropriate server
  027          030 010  	PUSHJ P,DLNBUG		; undef opcode?
  028                   
  029                   ; Remove PDB from input list and discard it.
  030                   
  031  DLNDDB  002 041  DLIDSC:	AOS DIWIN(DDB)		; open up that space in the window
  032                   	CONO PI,SCNOFF
  033          004 047  	MOVE TAC,PDBLNK(PDB)	; get the next
  034  DLNDDB  002 038  	MOVEM TAC,DILIST(DDB)	; make it the current now
  035          004 049  	HRRZS PDBLNK(TAC)	; unbind old PDB from list
  036          006 009  	JRST CLRPDB		; does CONO PI,SCNON and returns
  037                   
  038                   ; UUO-level packet type dispatch table
  039                   
  040                   UUOTAB:	CAI			; %NOP
  041                   	CAI			; %RPC
  042          009 028  	JRST DLICLS		; %CLS
  043                   	CAI			; %WIN
  044          009 007  	JRST DLIMSG		; %MSG
  045                   	CAI			; %NAK
  046          009 041  	JRST DLIEOF		; %EOF
  047          009 040  	JRST DLIINR		; %INT
  048                   	CAI			; %ERR
  049          008 040  OPMAX←←.-UUOTAB
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 9␈↓'α
  001                   ;DLIMSG DLMLUP DLICLS DLIINR DLIEOF
  002                   
  003                   ; Individual opcode handlers
  004                   
  005                   ; MSG -- stuff user buffer
  006                   
  007          004 060  DLIMSG:	LDB TAC,PKTCHN		; get its channel
  008                   	XCTR XR,[CAME TAC,2(UUO)] ; same as channel user wanted?
  009                   	 JRST [	XCTR XW,[MOVEM TAC,2(UUO)]
  010                   		POPJ P,]	; tell user the channel changed
  011          004 047  DLMLUP:	SOSGE PDBCNT(PDB)	; anything in this PDB?
  012                   	 JRST [	XCTR XW,[MOVEM AC3,(UUO)]
  013                   		XCTR XW,[MOVEM AC2,1(UUO)]
  014          008 031  		PUSHJ P,DLIDSC	; discard this PDB
  015          017 006  		PUSHJ P,GETARG	; retrieve pointer AC's
  016          008 022  		JRST DLILUP]
  017          004 047  	ILDB TAC,PDBPNT(PDB)	; get buffer byte
  018                   	XCTR XDB,[IDPB TAC,AC3]	; give user data byte
  019          009 011  	SOJG AC2,DLMLUP
  020                   	XCTR XW,[MOVEM AC3,(UUO)] ; return updated args to user
  021                   	XCTR XW,[MOVEM AC2,1(UUO)]
  022          004 047  	SKIPG PDBCNT(PDB)	; if this PDB is spent
  023          008 031  	 JRST DLIDSC		; discard it first
  024                   	POPJ P,			; all done
  025                   
  026                   ; CLS -- set IODERR, IODEND, clear DS%CON and return to user
  027                   
  028          004 047  DLICLS:	PUSH P,PDB
  029          014 010  	PUSHJ P,DLNCLS		; send return CLS
  030          004 047  	POP P,PDB
  031  DLNDDB  002 033  	SETZM DPID(DDB)		; clear PID
  032  DLNDDB  002 033  	SETZM DPID+1(DDB)
  033                   	MOVEI IOS,IODERR!IODEND	; and wake user up to the bad news
  034                   	IORB IOS,DEVIOS(DDB)
  035          008 031  	JRST DLIDSC		; discard PDB and return
  036                   
  037                   ; EOF -- set IODEND and return to user
  038                   ; INT -- set IOIMPM (I couldn't think of anything better to use)
  039                   
  040                   DLIINR:	TROA IOS,IOIMPM
  041                   DLIEOF:	 MOVEI IOS,IODEND	; tell user EOF happened
  042                   	IORB IOS,DEVIOS(DDB)	; happy UUOCON
  043          004 060  	LDB TAC,PKTCHN		; gobble down channel number
  044                   	XCTR XW,[MOVEM TAC,2(UUO)] ; pass it to user
  045          008 031  	JRST DLIDSC
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 10␈↓'α
  001                   ;DLNOUT DLONEW DLOOLD DLOLUP DLOOUT DLOOUX
  002                   
  003                   ; OUTPUT UUO
  004                   ;
  005                   ; Send data
  006                   ;	OUTPUT chn,block
  007                   ;	...
  008                   ; block:byte pointer to data buffer
  009                   ;	number of data bytes
  010                   ;	data channel
  011                   
  012          004 035  DLNOUT:	MOVEI TAC,DS%CON
  013  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; insist it be connected
  014          017 016  	 JRST NORPC
  015  DLNDDB  002 033  	SKIPN DPID(DDB)		; case of closed but picked up again
  016  DLNDDB  002 033  	 SKIPE DPID+1(DDB)	; (which cleared IODERR)
  017                   	  TRNE IOS,IODERR	; is connection closing?
  018                   	   POPJ P,		; yes, don't let it through
  019  DLNDDB  002 036  	SKIPE PDB,UUOPDB(DDB)	; get last output PDB
  020          010 032  	 JRST DLOOLD
  021          005 025  DLONEW:	PUSHJ P,MAKPDB		; none, make one
  022          030 010  	 PUSHJ P,DLNBUG		; no core at UUO level?
  023  DLNDDB  002 036  	MOVEM PDB,UUOPDB(DDB)
  024                   	XCTR XRW,[MOVES TAC,2(UUO)] ; data channel
  025          004 060  	DPB TAC,PKTCHN
  026                   	MOVEI TAC,=256		; empty packet
  027          004 047  	MOVEM TAC,PDBCNT(PDB)
  028          004 066  	MOVE TAC,PKTDAT		; data pointer
  029          004 047  	MOVEM TAC,PDBPNT(PDB)
  030          004 019  	MOVEI TAC,%MSG		; MSG type packet
  031          004 061  	DPB TAC,PKTOPC
  032          017 006  DLOOLD:	PUSHJ P,GETARG
  033                   	JUMPLE AC2,CPOPJ
  034          004 060  	LDB TAC,PKTCHN		; get packet's channel
  035                   	XCTR XR,[CAMN TAC,2(UUO)]
  036          004 047  DLOLUP:	 SOSGE PDBCNT(PDB)	; any space in this PDB?
  037                   	  JRST [XCTR XW,[MOVEM AC3,(UUO)]
  038                   		XCTR XW,[MOVEM AC2,1(UUO)]
  039  DLNDDB  002 042  		SKIPG DOWIN(DDB)
  040          016 013  		 PUSHJ P,DLHANG	; if window full, do checking hang
  041          010 064  		PUSHJ P,DLOOUX	; wrong channel or full, output it and start over
  042          017 006  		PUSHJ P,GETARG
  043                   		JUMPG AC2,DLONEW; loop back if more
  044                   		POPJ P,]
  045                   	XCTR XLB,[ILDB TAC,AC3]	; get user data byte
  046          004 047  	IDPB TAC,PDBPNT(PDB)	; store in our buffer
  047          010 036  	SOJG AC2,DLOLUP
  048                   	XCTR XW,[MOVEM AC3,(UUO)] ; return updated args to user
  049                   	XCTR XW,[MOVEM AC2,1(UUO)]
  050          004 047  	SKIPE PDBCNT(PDB)	; is PDB full?
  051                   	 POPJ P,		; no, return to user--we're done
  052                   
  053                   ; Here to output a PDB.  Also called as MTAPE 5 (force out buffer)
  054                   
  055  DLNDDB  002 036  DLOOUT:	SKIPN PDB,UUOPDB(DDB)	; get PDB
  056                   	 POPJ P,		; no PDB, just return
  057  DLNDDB  002 033  	SKIPN DPID(DDB)		; case of closed but picked up again
  058  DLNDDB  002 033  	 SKIPE DPID+1(DDB)	; (which cleared IODERR)
  059                   	  TRNE IOS,IODERR	; is connection closing?
  060  DLNDDB  002 036  	   JRST[SETZM UUOPDB(DDB)
  061          006 009  		JRST CLRPDB]	; yes, don't let it through
  062  DLNDDB  002 042  	SKIPG DOWIN(DDB)	; window still open?
  063          016 007  	 PUSHJ P,DXHANG		; wait or abort if so
  064  DLNDDB  002 036  DLOOUX:	SETZM UUOPDB(DDB)	; no longer any "old" PDB
  065                   	MOVEI TAC,=255
  066          004 047  	SKIPLE PDBCNT(PDB)
  067          004 047  	 SUB TAC,PDBCNT(PDB)	; TAC ← # of bytes in this packet -1
  068          006 009  	JUMPL TAC,CLRPDB	; just in case packet is empty
  069          004 064  	DPB TAC,PKTSIZ
  070          017 026  	JRST DLOUTQ		; output the PDB
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 11␈↓'α
  001                   ;DLNMTP DLNMDS
  002                   
  003                   ; MTAPE UUO dispatch
  004                   
  005                   DLNMTP:	XCTR XR,[SKIPL TAC,(UUO)] ; get function code
  006          011 018  	 CAIL TAC,DLNMMX
  007                   	  JRST UUOERR		; illegal function
  008          011 010  	JRST @DLNMDS(TAC)	; else dispatch to server
  009                   
  010          012 014  DLNMDS:	DLNRPC			; 0 request connection
  011          014 010  	DLNCLS			; 1 close connection
  012          014 035  	DLNWIN			; 2 set window size
  013          014 056  	DLNEOF			; 3 end of file
  014          015 009  	DLNINT			; 4 interrupt
  015          010 055  	DLOOUT			; 5 force out buffer
  016          015 035  	DLNSTA			; 6 return status bits
  017          015 054  	DLNCWA			; 7 wait for connection to complete
  018          011 010  DLNMMX←←.-DLNMDS
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 12␈↓'α
  001                   ;DLNRPC DLRCON
  002                   
  003                   ; Send RPC (request process connection)
  004                   ;	MTAPE chn,block
  005                   ;	 <error--dialing failed, error code in block>
  006                   ;	<won>
  007                   ;	...
  008                   ; block:0
  009                   ;	first 4 9-bit bytes of process ID
  010                   ;	last 4 9-bit bytes of process ID
  011                   ;	window wize
  012                   ;	phone number in ASCIZ (up to 4 words)
  013                   
  014          004 035  DLNRPC:	MOVEI TAC,DS%CON
  015  DLNDDB  002 030  	TDNE TAC,DSTAT(DDB)
  016                   	 JRST [	JSP TAC,UUOMES
  017                   		 ASCIZ/Dialnet RPC with connection open, UUO/]
  018  DLNDDB  002 033  	DMOVE TAC,DPID(DDB)	; see if want an acceptance
  019                   	XCTR XR,[DMOVE AC2,1(UUO)] ; get PID
  020                   	SKIPN TAC
  021          012 027  	 JUMPE TAC1,DLRCON
  022                   	SKIPN AC2		; want an accept, so a PID is illegal
  023          013 014  	 JUMPE AC3,DLNRPA
  024                   	JSP TAC,UUOMES
  025                   	 ASCIZ/Connect RPC on a busy Dialnet port, UUO/
  026                   
  027                   DLRCON:	SKIPN AC2		; want a connect, insist upon a PID
  028                   	 JUMPE AC3,[	JSP TAC,UUOMES
  029                   			 ASCIZ/Accept RPC on an idle Dialnet port, UUO/]
  030                   	XCTR XR,[SKIPN 4(UUO)]
  031          013 014  	 JRST DLNRPA		; user doesn't want to dial
  032          004 040  	MOVEI TAC,DS%CCR
  033  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; connected already?
  034                   	 JRST [	JSP TAC,UUOMES
  035                   		 ASCIZ/Attempt to dial while already dialed, UUO/]
  036          004 037  	MOVEI TAC,DS%IDL
  037  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; output program must be idle
  038          030 010  	 PUSHJ P,DLNBUG
  039                   	LDB TAC,PUNIT		; hang up line first
  040                   	PUSHJ P,DLNHNG
  041          016 026  	PUSHJ P,DCWAIT		; wait for 3 second wakeup
  042                   	LDB TAC,PUNIT		; re-enable DTR
  043                   	PUSHJ P,DLNPKU
  044          026 021  	MOVEI TAC,DLNRCH	; read a character at I-level
  045  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  046                   	MOVEI CHR,"↓"
  047          026 012  	JSP TAC,DLNOCH		; send an abort
  048          016 032  	PUSHJ P,DLWAIT
  049  DLNDDB  002 047  	MOVE CHR,DREP(DDB)	; get reply
  050                   	CAIE CHR,"B"
  051                   	 JRST [	JSP TAC,UUOMES
  052                   		 ASCIZ/Dialer failure, UUO/]
  053                   	XCTR XR,[DMOVE AC2,4(UUO)]
  054  DLNDDB  002 046  	DMOVEM AC2,DNUM(DDB)
  055                   	XCTR XR,[DMOVE AC2,6(UUO)]
  056  DLNDDB  002 046  	DMOVEM AC2,DNUM+2(DDB)
  057          026 028  	PUSHJ P,DLNDIL		; start dialing
  058          016 032  	PUSHJ P,DLWAIT		; wait for dialing to be done
  059  DLNDDB  002 047  	MOVE CHR,DREP(DDB)	; get reply code
  060                   	CAIE CHR,"A"		; did dialing win?
  061                   	 JRST [	MOVEM CHR,(UUO)	; you lost
  062                   		POPJ P,]
  063                   ;	JRST SNDNOP
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 13␈↓'α
  001                   ;SNDNOP DLNRPA DLNRWN
  002                   
  003                   ; Send a couple of NOPs, to allow for normal line flakiness
  004                   
  005          005 025  SNDNOP:	PUSHJ P,MAKPDB		; get an empty PDB (which happens to be a NOP)
  006          030 010  	 PUSHJ P,DLNBUG
  007          017 026  	PUSHJ P,DLOUTQ
  008          005 025  	PUSHJ P,MAKPDB
  009          030 010  	 PUSHJ P,DLNBUG
  010          017 026  	PUSHJ P,DLOUTQ
  011                   
  012                   ; Now send the RPC
  013                   
  014                   DLNRPA:	AOS (P)			; set skip return
  015  DLNDDB  002 042  	SKIPG DOWIN(DDB)	; window still open?
  016          016 007  	 PUSHJ P,DXHANG
  017          005 025  	PUSHJ P,MAKPDB
  018          030 010  	 PUSHJ P,DLNBUG
  019          004 016  	MOVEI TAC,%RPC		; RPC type packet
  020          004 061  	DPB TAC,PKTOPC
  021                   	MOVEI TAC,=10
  022          004 064  	DPB TAC,PKTSIZ
  023                   	XCTR XR,[DMOVE AC2,1(UUO)] ; get PID
  024                   	SKIPN AC2
  025          004 035  	 JUMPE AC3,[	MOVEI TAC,DS%CON
  026  DLNDDB  002 030  			IORM TAC,DSTAT(DDB) ; mark connection open for accept RPC
  027          013 029  			JRST DLNRWN]
  028  DLNDDB  002 033  	DMOVEM AC2,DPID(DDB)	; otherwise set PID for pending RPC
  029          004 047  DLNRWN:	DMOVEM AC2,PDBDAT(PDB)	; in any case, set PID in the packet
  030                   	XCTR XR,[MOVE TAC,3(UUO)] ; window size
  031          004 029  	CAIL TAC,WINMIN
  032          004 031  	 CAILE TAC,WINMAX
  033          004 030  	  MOVEI TAC,WINDEF	; user specified ridiculous argument
  034          004 070  	DPB TAC,PKTWNS
  035  DLNDDB  002 034  	EXCH TAC,DIWS(DDB)	; DIWS ← new window size
  036  DLNDDB  002 034  	SUB TAC,DIWS(DDB)	; TAC ← - # of PDB's added
  037                   	MOVNS TAC		; TAC ← # of PDB's added
  038  DLNDDB  002 041  	ADDM TAC,DIWIN(DDB)
  039          017 026  	JRST DLOUTQ
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 14␈↓'α
  001                   ;DLNCLS DLNWIN DLNEOF
  002                   
  003                   ; Send CLS (close process connection)
  004                   ;	CLOSE chn,
  005                   ;	   or
  006                   ;	MTAPE chn,block
  007                   ;	...
  008                   ; block:1
  009                   
  010          004 035  DLNCLS:	MOVEI TAC,DS%CON
  011  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; if there is no connection
  012                   	 POPJ P,		; it's a no-op
  013          010 055  	PUSHJ P,DLOOUT		; flush user output
  014  DLNDDB  002 042  	SKIPG DOWIN(DDB)	; window still open?
  015          016 007  	 PUSHJ P,DXHANG
  016          005 025  	PUSHJ P,MAKPDB		; get a PDB
  017          030 010  	 PUSHJ P,DLNBUG		; no core at UUO level?
  018          004 017  	MOVEI TAC,%CLS		; CLS type packet
  019          004 061  	DPB TAC,PKTOPC
  020          004 035  	MOVEI TAC,DS%CON
  021  DLNDDB  002 030  	ANDCAM TAC,DSTAT(DDB)	; mark connection as closed (reply clears PID)
  022          017 026  	PUSHJ P,DLOUTQ
  023  DLNDDB  002 033  	SKIPE DPID(DDB)
  024          016 007  	 PUSHJ P,DXHANG
  025  DLNDDB  002 033  	SKIPE DPID+1(DDB)
  026          016 007  	 PUSHJ P,DXHANG
  027                   	POPJ P,
  028                   
  029                   ; Send WIN (set window size)
  030                   ;	MTAPE chn,block
  031                   ;	...
  032                   ; block:2
  033                   ;	window size
  034                   
  035  DLNDDB  002 042  DLNWIN:	SKIPG DOWIN(DDB)	; window still open?
  036          016 007  	 PUSHJ P,DXHANG
  037          005 025  	PUSHJ P,MAKPDB
  038          030 010  	 PUSHJ P,DLNBUG
  039          004 018  	MOVEI TAC,%WIN		; WIN type packet
  040          004 061  	DPB TAC,PKTOPC
  041                   	XCTR XR,[MOVE TAC,2(UUO)] ; window size
  042          004 029  	CAIL TAC,WINMIN
  043          004 031  	 CAILE TAC,WINMAX
  044          004 030  	  MOVEI TAC,WINDEF	; user specified ridiculous argument
  045          004 067  	DPB TAC,PKTFDA
  046  DLNDDB  002 034  	EXCH TAC,DIWS(DDB)	; DIWS ← new window size
  047  DLNDDB  002 034  	SUB TAC,DIWS(DDB)	; TAC ← - # of PDB's added
  048          017 026  	JRST DLOUTQ
  049                   
  050                   ; Send EOF (end of file)
  051                   ;	MTAPE chn,block
  052                   ;	...
  053                   ; block:3
  054                   ;	Dialnet channel
  055                   
  056                   DLNEOF:	XCTR XR,[SKIPL DAT,1(UUO)] ; channel
  057                   	 CAILE DAT,17		; channel #'s are a 4 bit field
  058          017 021  	  JRST DCHLUZ
  059          004 035  	MOVEI TAC,DS%CON
  060  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)
  061          017 016  	 JRST NORPC
  062          010 055  	PUSHJ P,DLOOUT		; flush output
  063  DLNDDB  002 042  	SKIPG DOWIN(DDB)	; window still open?
  064          016 007  	 PUSHJ P,DXHANG
  065          005 025  	PUSHJ P,MAKPDB		; create a new PDB
  066          030 010  	 PUSHJ P,DLNBUG
  067          004 060  	DPB DAT,PKTCHN
  068          004 021  	MOVEI TAC,%EOF		; end of file
  069          004 061  	DPB TAC,PKTOPC
  070          017 026  	JRST DLOUTQ
␈↓&	UUO routines                                                     DLNSER[S,SYS] 08/14/78  Page 15␈↓'α
  001                   ;DLNINT DLNSTA DLNCWA
  002                   
  003                   ; Send INT (interrupt)
  004                   ;	MTAPE chn,block
  005                   ;	...
  006                   ; block:4
  007                   ;	Dialnet channel
  008                   
  009                   DLNINT:	XCTR XR,[SKIPL DAT,1(UUO)] ; channel
  010                   	 CAILE DAT,17		; 0≤channel≤17
  011          017 021  	  JRST DCHLUZ
  012          004 035  	MOVEI TAC,DS%CON
  013  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)
  014          017 016  	 JRST NORPC
  015  DLNDDB  002 042  	SKIPG DOWIN(DDB)	; window still open?
  016          016 007  	 PUSHJ P,DXHANG
  017          005 025  	PUSHJ P,MAKPDB
  018          030 010  	 PUSHJ P,DLNBUG
  019          004 060  	DPB DAT,PKTCHN
  020          004 022  	MOVEI TAC,%INT		; interrupt
  021          004 061  	DPB TAC,PKTOPC
  022          017 026  	JRST DLOUTQ
  023                   
  024                   ; Get Dialnet status
  025                   ;	MTAPE chn,block
  026                   ;	...
  027                   ; block:6
  028                   ;	status bits returned here
  029                   ;	first 4 bytes of PID
  030                   ;	second 4 bytes of PID
  031                   ;	input window size
  032                   ;	output window size
  033                   ;	four words of ASCIZ phone number
  034                   
  035  DLNDDB  002 030  DLNSTA:	MOVE TAC,DSTAT(DDB)	; get status bits
  036                   	XCTR XW,[MOVEM TAC,1(UUO)]
  037  DLNDDB  002 033  	DMOVE TAC,DPID(DDB)	; process ID
  038                   	XCTR XW,[DMOVEM TAC,2(UUO)]
  039  DLNDDB  002 034  	DMOVE TAC,DIWS(DDB)	; window sizes
  040                   	XCTR XW,[DMOVEM TAC,4(UUO)]
  041  DLNDDB  002 046  	DMOVE TAC,DNUM(DDB)	; phone number
  042                   	XCTR XW,[DMOVEM TAC,6(UUO)]
  043  DLNDDB  002 046  	DMOVE TAC,DNUM+2(DDB)
  044                   	XCTR XW,[DMOVEM TAC,10(UUO)]
  045                   	POPJ P,
  046                   
  047                   ; Wait for connection to open
  048                   ;	MTAPE chn,block
  049                   ;	 <connection refused>
  050                   ;	<connection open>
  051                   ;	..
  052                   ; block:7
  053                   
  054          004 035  DLNCWA:	MOVEI TAC,DS%CON
  055  DLNDDB  002 030  	TDNE TAC,DSTAT(DDB)	; connection open yet?
  056                   	 JRST CPOPJ1
  057  DLNDDB  002 033  	MOVE TAC,DPID(DDB)	; or maybe refused?
  058  DLNDDB  002 033  	SKIPN DPID+1(DDB)	; you lose buckeroo
  059                   	 JUMPE TAC,CPOPJ
  060          016 032  	PUSHJ P,DLWAIT
  061          015 054  	JRST DLNCWA
␈↓&	Random UUO subroutines                                           DLNSER[S,SYS] 08/14/78  Page 16␈↓'α
  001                   ;DXHANG DLHANG DCWAIT DLWAIT DCWAKE DLWAKE
  002                   
  003                   SUBTTL Random UUO subroutines
  004                   
  005                   ; Similar to DXHANG, but don't check wait bit, etc.
  006                   
  007                   DXHANG:	SOS (P)			; point stack at previous instruction
  008                   	SOS (P)
  009          016 032  	JRST DLWAIT		; go into IOWQ
  010                   
  011                   ; Here for I/O UUO's to hang until the previous instruction skips.
  012                   
  013                   DLHANG:	XCTR XW,[MOVEM AC3,(UUO)] ; return updated args to user
  014                   	XCTR XW,[MOVEM AC2,1(UUO)]
  015          004 035  	MOVEI TAC,DS%CON
  016  DLNDDB  002 030  	TDNE TAC,DSTAT(DDB)
  017                   	 TLNE AC3,40
  018                   	  JRST [ADJSP P,-1 ↔ POPJ P,]
  019                   	SOS (P)			; point stack at previous instruction
  020                   	SOS (P)
  021          016 032  	JRST DLWAIT		; go into IOWQ
  022                   
  023                   ;  Here to enter IOWQ.  DCWAIT is used to sleep for 5 seconds.  Preserves
  024                   ; PDB, AC2, AC3, & DDB.
  025                   
  026                   DCWAIT:	LDB TAC,PUNIT		; clock level has to find the DDB
  027                   	LSH TAC,=12
  028          016 045  	IOR TAC,[DCWAKE,,5*JIFSEC] ; wait five seconds
  029                   	CONO PI,PIOFF
  030                   	IDPB TAC,CLOCK(PID)
  031                   	CONO PI,PION
  032                   DLWAIT:	MOVSI IOS,DEVSBB	; DLN is internally buffered
  033                   	IORB IOS,DEVIOS(DDB)
  034          004 047  	PUSH P,PDB		; preserve PDB and possible pointer AC's
  035                   	PUSH P,AC2
  036                   	PUSH P,AC3
  037                   	PUSHJ P,WSYNC		; wait until I-level says can go
  038                   	POP P,AC3		; restore our AC's
  039                   	POP P,AC2
  040          004 047  	POP P,PDB
  041                   	POPJ P,
  042                   
  043                   ; Here to wake up a process in IOWQ.  DCWAKE is the clock queue entry point.
  044                   
  045                   DCWAKE:	LDB TAC,[140600,,DAT]	; here from clock-level, get unit #
  046  DLNDDB  002 057  	MOVE DDB,DLNUTB(TAC)	; and DDB thereof
  047                   DLWAKE:	MOVE IOS,DEVIOS(DDB)
  048                   	TLZ IOS,DEVSBB		; system buffer no longer busy
  049                   	TLZE IOS,IOW		; was job in I/O wait?
  050                   	 PUSHJ P,STTIOD		; put job into TQ
  051                   	MOVEM IOS,DEVIOS(DDB)
  052                   	POPJ P,
␈↓&	Random UUO subroutines                                           DLNSER[S,SYS] 08/14/78  Page 17␈↓'α
  001                   ;GETARG NORPC DCHLUZ DLOUTQ DLOUQ1
  002                   
  003                   ;  Get I/O UUO args.  AC3 ← byte pointer, AC2 ← byte count.  Also checks for
  004                   ; writeability.
  005                   
  006                   GETARG:	XCTR XRW,[MOVES AC2,1(UUO)] ; AC2 ← byte count
  007                   	XCTR XRW,[MOVES AC3,(UUO)] ; AC3 ← user's byte pointer
  008                   	TLNN AC3,7700		; did user specify a size?
  009                   	 TLZA AC3,777737	; nope, flush whatever was there
  010                   	  TLZA AC3,37		; flush index and indirect
  011                   	   TLO AC3,441100	; force 9-bit byte pointer
  012                   	POPJ P,
  013                   
  014                   ; Here when trying to do I/O without a Dialnet connection
  015                   
  016                   NORPC:	JSP TAC,UUOMES
  017                   	 ASCIZ\Dialnet I/O without RPC, UUO\
  018                   
  019                   ; Here when data channel <0 or >17
  020                   
  021                   DCHLUZ:	JSP TAC,UUOMES
  022                   	 ASCIZ/Illegal Dialnet channel number, UUO/
  023                   
  024                   ; Here to queue a PDB for output
  025                   
  026          004 061  DLOUTQ:	LDB TAC,PKTOPC		; check opcode
  027          017 033  	JUMPE TAC,DLOUQ1	; knows that %NOP=0
  028          004 023  	CAIE TAC,%ERR
  029          004 020  	 CAIN TAC,%NAK
  030          017 033  	  JRST DLOUQ1		; these don't count against the window
  031  DLNDDB  002 042  	SOSGE DOWIN(DDB)	; decrement window
  032          030 010  	 PUSHJ P,DLNBUG		; some loser didn't check!
  033  DLNDDB  002 039  DLOUQ1:	MOVEI TAC,DOLIST(DDB)	; start at the beginning
  034                   	CONO PI,SCNOFF
  035                   	HRRZ TAC1,(TAC)		; run down the list until at end
  036                   	JUMPN TAC1,[MOVEI TAC,(TAC1) ↔ JRST .-1]
  037  DLNDDB  002 039  	SKIPE DOLIST(DDB)	; unless there is no list
  038          004 047  	 HRLZM TAC,(PDB)	; bind list to new
  039          004 047  	HRRM PDB,(TAC)		; bind new to list
  040                   	CONO PI,SCNON
  041          004 037  	MOVEI TAC,DS%IDL
  042  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; output I-level idle?
  043                   	 POPJ P,		; no, it'll get to it naturally
  044          024 009  	JRST WRLSTX		; start up output I-level
␈↓&	Crock-level                                                      DLNSER[S,SYS] 08/14/78  Page 18␈↓'α
  001                   ;DLNCLK DLNCL1 DLNCL2
  002                   
  003                   SUBTTL Crock-level
  004                   
  005                   ;  This creature is called every 5 seconds to paw over all the
  006                   ; Dialnet ports and put no-ops on any one that looks idle.  This
  007                   ; is to prevent lossage due to dropped acknowledges which might
  008                   ; otherwise cause deadly embraces (hug hug).
  009                   
  010                   DLNCLK:	MOVE TAC,[DLNCLK,,5*JIFSEC] ; requeue the request
  011                   	CONO PI,PIOFF
  012                   	IDPB TAC,CLOCK(PID)
  013                   	CONO PI,PION
  014                   	MOVSI TAC,-DLNNUM
  015  DLNDDB  002 057  DLNCL1:	MOVE DDB,DLNUTB(TAC)	; get DDB for this unit
  016                   	PUSH P,TAC
  017  DLNDDB  002 030  	MOVE TAC,DSTAT(DDB)
  018          004 037  	TRNE TAC,DS%IDL		; line should be idle
  019          004 040  	 TRNN TAC,DS%CCR	; and there should be carrier
  020          018 038  	  JRST DLNCL2		; otherwise don't consider this port
  021  DLNDDB  002 039  	SKIPE DOLIST(DDB)	; output list had better be empty
  022          030 010  	 PUSHJ P,DLNBUG
  023                   	CONO PI,SCNOFF
  024  DLNDDB  002 040  	SKIPN PDB,DXLIST(DDB)	; see if want to resend the top of the pending queue
  025                   	 JRST [	CONO PI,SCNON
  026          005 025  		PUSHJ P,MAKPDB	; create a no-op
  027          018 038  		 JRST DLNCL2
  028          017 026  		PUSHJ P,DLOUTQ	; queue it for output
  029          018 038  		JRST DLNCL2]
  030          004 047  	HRRZ TAC,PDBLNK(PDB)	; get its next
  031          004 047  	SETZM PDBLNK(PDB)	; unlink it from the next
  032                   	SKIPE TAC
  033          004 049  	 HRRZS PDBLNK(TAC)	; unlink this one from the next
  034  DLNDDB  002 040  	MOVEM TAC,DXLIST(DDB)	; and remove this from the queue
  035  DLNDDB  002 039  	MOVEM PDB,DOLIST(DDB)
  036                   	CONO PI,SCNON
  037          024 009  	PUSHJ P,WRLSTX
  038                   DLNCL2:	POP P,TAC
  039          018 015  	AOBJN TAC,DLNCL1	; loop through for each DDB
  040                   	POPJ P,
␈↓&	Input I-level loop                                               DLNSER[S,SYS] 08/14/78  Page 19␈↓'α
  001                   ;RDPCKT RDPCKX RDPDAT
  002                   
  003                   SUBTTL Input I-level loop
  004                   
  005                   ;  Stuff a PDB with an incoming packet, do framing, checksum, and sequence
  006                   ; verification.  Entered when an SOP happens.
  007                   
  008  DLNDDB  002 037  RDPCKT:	SKIPE PDB,INTPDB(DDB)	; is there a PDB from before?
  009          019 013  	 JRST RDPCKX
  010          005 025  	PUSHJ P,MAKPDB		; get a new PDB
  011                   	 POPJ P,
  012  DLNDDB  002 037  	MOVEM PDB,INTPDB(DDB)
  013                   RDPCKX:	MOVEI TAC,1		; initialize checksum
  014          004 047  	MOVEM TAC,PDBCHK(PDB)
  015          026 007  	JSP TAC,DLNICH		; word 1 - packet channel/op code
  016          026 063  	PUSHJ P,CHKBYT
  017          004 059  	DPB CHR,PKTCOP
  018          026 007  	JSP TAC,DLNICH		; word 2 - packet sequence number
  019          026 063  	PUSHJ P,CHKBYT
  020          004 062  	DPB CHR,PKTSEQ
  021          026 007  	JSP TAC,DLNICH		; word 3 - packet acknowledgement
  022          026 063  	PUSHJ P,CHKBYT
  023          004 063  	DPB CHR,PKTACK
  024          026 007  	JSP TAC,DLNICH		; word 4 - packet size
  025          026 063  	PUSHJ P,CHKBYT
  026          004 064  	DPB CHR,PKTSIZ
  027          004 047  	MOVEM CHR,PDBCNT(PDB)	; packet data area byte count
  028          004 066  	MOVE TAC,PKTDAT		; byte pointer
  029          004 047  	MOVEM TAC,PDBPNT(PDB)
  030          026 007  RDPDAT:	JSP TAC,DLNICH		; data byte
  031          026 063  	PUSHJ P,CHKBYT
  032          004 047  	IDPB CHR,PDBPNT(PDB)
  033          004 047  	SOSL PDBCNT(PDB)	; continue until read all data
  034          019 030  	 JRST RDPDAT
  035                   	MOVEI TAC,600000	; stray bits in checksum
  036          004 047  	ANDCAM TAC,PDBCHK(PDB)	; get flushed here
  037          026 007  	JSP TAC,DLNICH		; packet checksum
  038          004 047  	XORM CHR,PDBCHK(PDB)
  039          026 007  	JSP TAC,DLNICH
  040                   	LSH CHR,=8		; high order 8 bits of checksum
  041          004 047  	XORB CHR,PDBCHK(PDB)
  042          004 039  	MOVEI TAC,DS%EOP
  043                   	SKIPN CHR		; if not checksum error
  044  DLNDDB  002 030  	 IORM TAC,DSTAT(DDB)	; tell RDPDUN it has permission to run
  045          026 007  	JSP TAC,DLNICH		; end of coroutine
  046                   	MOVEI TAC,CPOPJ		; mark input idle
  047  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  048  DLNDDB  002 037  	SETZM INTPDB(DDB)
  049          006 009  	JRST CLRPDB		; return means framing error
␈↓&	Input I-level loop                                               DLNSER[S,SYS] 08/14/78  Page 20␈↓'α
  001                   ;RDPDUN RDPSIW RDPFAK RDPCKN RDPNRT
  002                   
  003                   ; Here when an EOP received
  004                   
  005  DLNDDB  002 027  RDPDUN:	AOS NINPKT(DDB)		; count up one more winner
  006  DLNDDB  002 041  	SOSL DIWIN(DDB)		; any space in window?
  007          020 009  	 JRST RDPSIW
  008          003 010  	DLNMSG(<Window overrun>)
  009                   RDPSIW:	MOVEI TAC,CPOPJ		; mark input idle
  010  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  011  DLNDDB  002 037  	SETZM INTPDB(DDB)	; remove this PDB from input I-level
  012          004 047  	PUSH P,PDB
  013          004 063  	LDB TAC1,PKTACK		; packet remote guy is acknowledging
  014          020 030  	JUMPE TAC1,RDPCKN	; explicit no-acknowledge
  015  DLNDDB  002 040  	SKIPN PDB,DXLIST(DDB)	; check acknowledgement list
  016          020 030  	 JRST RDPCKN
  017          004 062  RDPFAK:	LDB TAC,PKTSEQ
  018                   	CAIE TAC,(TAC1)		; found the one being acknowledged?
  019          004 047  	 JRST [	HRRZ PDB,PDBLNK(PDB) ; nope, try next on the list
  020          020 017  		JUMPN PDB,RDPFAK
  021          020 030  		JRST RDPCKN]
  022          004 047  	HLRZ TAC,PDBLNK(PDB)	; TAC ← previous
  023                   	SKIPN TAC
  024  DLNDDB  002 040  	 MOVEI TAC,DXLIST(DDB)	; if no previous, flush the list
  025          004 049  	HLLZS PDBLNK(TAC)
  026          004 047  	HRRZS PDBLNK(PDB)	; complete the amputation
  027          006 009  	PUSHJ P,CLRPDB		; now delete all of these packets
  028  DLNDDB  002 042  	AOS DOWIN(DDB)
  029          004 047  	JUMPN PDB,.-2
  030          004 047  RDPCKN:	POP P,PDB
  031          004 062  	LDB TAC,PKTSEQ		; get seq # of this packet
  032          021 018  	JUMPE TAC,RDPPK0	; packet 0 always wins
  033  DLNDDB  002 043  	MOVE TAC1,DACK(DDB)	; get expected packet
  034                   	ADDI TAC1,1
  035                   	TRZE TAC1,400		; overflow case
  036                   	 MOVEI TAC1,1
  037                   	CAIN TAC,(TAC1)		; was this the packet we expected?
  038          021 005  	 JRST RDPPAK
  039                   	SUBI TAC,(TAC1)		; sexy modulo 2↑8 comparison (thank you, Dave Moon)
  040                   	TRNE TAC,200		; sorry luv, I have a headache
  041          021 031  	 JRST RDPNOP		; unnecessary retransmission
  042          004 047  	PUSH P,PDB
  043  DLNDDB  002 042  	SKIPLE DOWIN(DDB)	; make sure the window is open
  044          005 025  	 PUSHJ P,MAKPDB		; get a PDB to frob
  045          020 049  	  JRST RDPNRT
  046          004 020  	MOVEI TAC,%NAK		; NAK type packet
  047          004 061  	DPB TAC,PKTOPC
  048          017 026  	PUSHJ P,DLOUTQ		; make PDB available for output
  049          004 047  RDPNRT:	POP P,PDB
  050          021 031  	JRST RDPNOP
␈↓&	Input I-level loop                                               DLNSER[S,SYS] 08/14/78  Page 21␈↓'α
  001                   ;RDPPAK RDPNPK RDPPK0 RDPNOP INTTAB
  002                   
  003                   ; Positive acknowledge
  004                   
  005  DLNDDB  002 043  RDPPAK:	MOVEM TAC,DACK(DDB)	; remember to acknowledge this one
  006          004 041  	MOVEI TAC,DS%ACN
  007  DLNDDB  002 030  	IORM TAC,DSTAT(DDB)	; note that an acknowledgement is needed
  008          004 047  	PUSH P,PDB
  009          004 037  	MOVEI TAC,DS%IDL
  010  DLNDDB  002 030  	TDNE TAC,DSTAT(DDB)	; if output is idle, acknowledge it manually
  011          005 025  	 PUSHJ P,MAKPDB		; get an empty PDB (which happens to be a NOP)
  012          021 017  	  JRST RDPNPK		; not idle or no core
  013  DLNDDB  002 039  	SKIPE DOLIST(DDB)
  014          030 010  	 PUSHJ P,DLNBUG		; not really idle?
  015  DLNDDB  002 039  	MOVEM PDB,DOLIST(DDB)	; create a "list"
  016          024 009  	PUSHJ P,WRLSTX		; acknowledge the packet
  017          004 047  RDPNPK:	POP P,PDB
  018          004 066  RDPPK0:	MOVE TAC,PKTDAT		; set up pointer
  019          004 047  	MOVEM TAC,PDBPNT(PDB)
  020          004 064  	LDB TAC,PKTSIZ		; and counter
  021                   	AOS TAC
  022          004 047  	MOVEM TAC,PDBCNT(PDB)
  023          004 040  	MOVEI TAC,DS%CCR	; find out about carrier detect
  024  DLNDDB  002 030  	IORM TAC,DSTAT(DDB)
  025          004 061  	LDB TAC,PKTOPC
  026          008 049  	CAIGE TAC,OPMAX		; legal opcode?
  027          021 037  	 JRST @INTTAB(TAC)	; yes, dispatch to appropriate server
  028          003 010  	DLNMSG(<Illegal opcode>,TAC)
  029          027 008  	PUSHJ P,SNDERR
  030                   	 ASCIZ/Illegal opcode/
  031  DLNDDB  002 041  RDPNOP:	AOS DIWIN(DDB)		; open up the window
  032          006 009  	PUSHJ P,CLRPDB
  033          016 047  	JRST DLWAKE
  034                   
  035                   ; I-level opcode dispatch table
  036                   
  037          021 031  INTTAB:	RDPNOP			; %NOP
  038          023 005  	RDPRPC			; %RPC
  039          023 038  	RDPCLS			; %CLS
  040          022 021  	RDPWIN			; %WIN
  041          022 005  	RDPMSG			; %MSG
  042          022 048  	RDPNAK			; %NAK
  043          022 005  	RDPMSG			; %EOF
  044          022 037  	RDPINT			; %INT
  045          022 070  	RDPERR			; %ERR
  046                   
  047          021 037  IFN OPMAX-<.-INTTAB>,<.FATAL INTTAB loses>
␈↓&	Input I-level loop                                               DLNSER[S,SYS] 08/14/78  Page 22␈↓'α
  001                   ;RDPMSG RDPWIN RDPWN1 RDPINT RDPNAK REVPDB RDPERR
  002                   
  003                   ; Incoming message
  004                   
  005          004 035  RDPMSG:	MOVEI TAC,DS%CON	; must be connected
  006  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)
  007          003 010  	 JRST [	DLNMSG(<No connection>)
  008          027 008  		PUSHJ P,SNDERR
  009                   		 ASCIZ/MSG, EOF, or INT with no connection/
  010          021 031  		JRST RDPNOP]
  011  DLNDDB  002 038  	MOVEI TAC,DILIST(DDB)
  012          004 049  	HRRZ TAC1,PDBLNK(TAC)	; run down list
  013                   	JUMPN TAC1,[MOVEI TAC,(TAC1) ↔ JRST .-1]
  014          004 049  	HRRZM PDB,PDBLNK(TAC)	; link message at end of list
  015  DLNDDB  002 038  	CAIE TAC,DILIST(DDB)	; never link the DDB in!
  016          004 047  	 HRLZM TAC,PDBLNK(PDB)
  017          016 047  	JRST DLWAKE
  018                   
  019                   ; Set window size
  020                   
  021          004 067  RDPWIN:	LDB TAC,PKTFDA		; get desired window
  022          004 029  RDPWN1:	CAIL TAC,WINMIN		; check for within bounds (here from RPC code)
  023          004 031  	 CAILE TAC,WINMAX
  024          003 010  	  JRST [DLNMSG(<Bad window size>,TAC)
  025          027 008  		PUSHJ P,SNDERR
  026                   		 ASCIZ/Illegal window size, using system default/
  027                   		MOVEI TAC,WINDEF; default
  028                   		JRST .+1]
  029  DLNDDB  002 035  	EXCH TAC,DOWS(DDB)	; set the window
  030  DLNDDB  002 035  	SUB TAC,DOWS(DDB)
  031                   	MOVNS TAC
  032  DLNDDB  002 042  	ADDM TAC,DOWIN(DDB)
  033          021 031  	JRST RDPNOP
  034                   
  035                   ; Interrupt
  036                   
  037                   RDPINT:	LDB J,PJOBN		; get owner's job #
  038          022 005  	JUMPE J,RDPMSG		; no owner
  039                   	MOVSI TAC,INTINS
  040                   	TDNN TAC,JBTIEN(J)	; job take this int?
  041          022 005  	 JRST RDPMSG
  042                   	IORM TAC,JBTIRQ(J)	; yes, give job the int
  043                   	SETOM INTREQ
  044          022 005  	JRST RDPMSG
  045                   
  046                   ; Here when a request comes in to requeue the list (ie, a NAK)
  047                   
  048  DLNDDB  002 041  RDPNAK:	AOS DIWIN(DDB)
  049          006 009  	PUSHJ P,CLRPDB
  050  DLNDDB  002 040  	SKIPN PDB,DXLIST(DDB)	; get unacknowledged list
  051          016 047  	 JRST DLWAKE
  052          004 047  REVPDB:	MOVSS TAC,PDBLNK(PDB)	; reverse the list (thank you, Guy Steele!)
  053          004 047  	HLRZ PDB,PDBLNK(PDB)	; PDB←previous(PDB), TAC←next(PDB)
  054          022 052  	JUMPN PDB,REVPDB
  055                   	SKIPN TAC		; just take a look at this nifty hack!!!
  056  DLNDDB  002 040  	 SKIPA PDB,DXLIST(DDB)	; if next(PDB)=0 then PDB←list
  057          004 049  	  HLRZ PDB,PDBLNK(TAC)	; else PDB←previous(next(PDB))
  058  DLNDDB  002 040  	MOVE TAC1,DXLIST(DDB)	; remember where it ends
  059  DLNDDB  002 040  	SETZM DXLIST(DDB)	; remove all traces of pending list
  060  DLNDDB  002 039  	SKIPN TAC,DOLIST(DDB)	; is there a list in progress?
  061  DLNDDB  002 039  	 JRST [	MOVEM PDB,DOLIST(DDB)
  062          024 009  		PUSHJ P,WRLSTX	; start up output
  063          016 047  		JRST DLWAKE]
  064          004 049  	HRLM TAC1,PDBLNK(TAC)	; link requeue list at front of output list
  065          004 049  	HRRM TAC,PDBLNK(TAC1)	; and output list at end of requeue list
  066          016 047  	JRST DLWAKE
  067                   
  068                   ; Error
  069                   
  070          004 066  RDPERR:	DLNMSG(<Error received>,,PKTDAT)
  071          021 031  	JRST RDPNOP
␈↓&	Input I-level loop                                               DLNSER[S,SYS] 08/14/78  Page 23␈↓'α
  001                   ;RDPRPC RDRPC2 RDPCLS RDPCL1
  002                   
  003                   ; Open connection
  004                   
  005          004 035  RDPRPC:	MOVEI TAC,DS%CON
  006  DLNDDB  002 030  	TDNE TAC,DSTAT(DDB)	; is there a connection?
  007          003 010  	 JRST [	DLNMSG(<Spurious RPC>)
  008          027 008  		PUSHJ P,SNDERR
  009                   		 ASCIZ/RPC when a connection exists/
  010          021 031  		JRST RDPNOP]
  011          004 047  	DMOVE AC2,PDBDAT(PDB)	; AC2/AC3 ← PID
  012  DLNDDB  002 033  	SKIPN DPID(DDB)		; is there a PID already?
  013  DLNDDB  002 033  	 SKIPE DPID+1(DDB)
  014          004 035  	  JRST [MOVEI TAC,DS%CON
  015  DLNDDB  002 030  		IORM TAC,DSTAT(DDB) ; mark connection open
  016                   		SKIPN AC2	; if so, PID must be zero
  017          023 031  		 JUMPE AC3,RDRPC2
  018  DLNDDB  002 030  		ANDCAM TAC,DSTAT(DDB) ; mark connection closed
  019  DLNDDB  002 033  		SETZM DPID(DDB)	; flush PIDs
  020  DLNDDB  002 033  		SETZM DPID+1(DDB)
  021          003 010  		DLNMSG(<Non-null PID in accept RPC>)
  022          027 008  		PUSHJ P,SNDERR
  023                   		 ASCIZ/Non-null PID in accept RPC/
  024          021 031  		JRST RDPNOP]
  025                   	SKIPN AC2		; otherwise, PID must be non-zero
  026          003 010  	 JUMPE AC3,[	DLNMSG(<Null PID in connect RPC>)
  027          027 008  			PUSHJ P,SNDERR
  028                   			 ASCIZ/Null PID in connect RPC/
  029          021 031  			JRST RDPNOP]
  030  DLNDDB  002 033  	DMOVEM AC2,DPID(DDB)
  031          026 047  RDRPC2:	PUSHJ P,DLNLGR		; run the logger
  032          004 070  	LDB TAC,PKTWNS
  033          021 031  	JUMPE TAC,RDPNOP	; forget it if none
  034          022 022  	JRST RDPWN1
  035                   
  036                   ; Close connection
  037                   
  038                   RDPCLS:	LDB J,PJOBN
  039          023 047  	JUMPE J,RDPCL1
  040                   	MOVEI IOS,IODERR	; note close coming
  041                   	IORB IOS,DEVIOS(DDB)
  042                   	MOVSI TAC,INTIMS	; status change
  043                   	TDNN TAC,JBTIEN(J)
  044          023 047  	 JRST RDPCL1
  045                   	IORM TAC,JBTIRQ(J)
  046                   	SETOM INTREQ
  047          004 035  RDPCL1:	MOVEI TAC,DS%CON
  048  DLNDDB  002 030  	TDNE TAC,DSTAT(DDB)	; is connection closing?
  049          022 005  	 JRST RDPMSG		; yes, put it into input list
  050  DLNDDB  002 033  	SETZM DPID(DDB)		; clear PID no matter what
  051  DLNDDB  002 033  	SETZM DPID+1(DDB)
  052          006 009  	JUMPN J,CLRPDB
  053          006 009  	PUSHJ P,CLRPDB		; otherwise forget it
  054          007 028  	JRST DLNRLS		; and do release cruft
␈↓&	Output I-level loop                                              DLNSER[S,SYS] 08/14/78  Page 24␈↓'α
  001                   ;WRLIST WRLSTX WRPSOP
  002                   
  003                   SUBTTL Output I-level loop
  004                   
  005                   ; Outputs packets from the list.
  006                   
  007  DLNDDB  002 039  WRLIST:	SKIPN PDB,DOLIST(DDB)	; get packet to do now
  008                   	 POPJ P,
  009          004 037  WRLSTX:	MOVEI TAC,DS%IDL
  010  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; better have been "idle" at this point
  011          030 010  	 PUSHJ P,DLNBUG
  012  DLNDDB  002 030  	ANDCAM TAC,DSTAT(DDB)	; output I-level active again
  013          004 062  	LDB TAC,PKTSEQ		; if it already has a sequence number (as in
  014          024 025  	JUMPN TAC,WRPSOP	; requeueing), don't generate another!
  015          004 061  	LDB TAC,PKTOPC		; check opcode
  016          024 025  	JUMPE TAC,WRPSOP	; knows that %NOP=0
  017          004 023  	CAIE TAC,%ERR
  018          004 020  	 CAIN TAC,%NAK
  019          024 025  	  JRST WRPSOP		; error and no-op packets don't get numbers
  020  DLNDDB  002 044  	AOS CHR,DSEQ(DDB)	; word 3 -- packet sequence number
  021                   	TRZE CHR,400
  022                   	 MOVEI CHR,1		; cycle back to 1 on overflow
  023          004 062  	DPB CHR,PKTSEQ
  024  DLNDDB  002 044  	MOVEM CHR,DSEQ(DDB)	; in case of wraparound
  025                   WRPSOP:	MOVEI TAC,1		; init checksum
  026          004 047  	MOVEM TAC,PDBCHK(PDB)
  027          004 007  	MOVEI CHR,%DLE		; all packets start with SOP
  028          026 015  	JSP TAC,DLNOC1		; DLNOC1 skips DLE check
  029          004 011  	MOVEI CHR,%STX
  030          026 012  	JSP TAC,DLNOCH
  031          004 059  	LDB CHR,PKTCOP		; word 1 -- packet channel/op code
  032          026 063  	PUSHJ P,CHKBYT
  033          026 012  	JSP TAC,DLNOCH
  034          004 062  	LDB CHR,PKTSEQ		; word 2 -- packet number
  035          026 063  	PUSHJ P,CHKBYT
  036          026 012  	JSP TAC,DLNOCH
  037  DLNDDB  002 043  	MOVE CHR,DACK(DDB)	; word 3 -- packet acknowledgement
  038          004 063  	DPB CHR,PKTACK
  039          026 063  	PUSHJ P,CHKBYT
  040          004 041  	MOVEI TAC,DS%ACN	; note that we've acknowledged one
  041  DLNDDB  002 030  	ANDCAM TAC,DSTAT(DDB)
  042          026 012  	JSP TAC,DLNOCH
  043          004 064  	LDB CHR,PKTSIZ		; word 4 -- packet size -1
  044          026 063  	PUSHJ P,CHKBYT
  045          004 047  	MOVEM CHR,PDBCNT(PDB)
  046          026 012  	JSP TAC,DLNOCH
  047          004 066  	MOVE TAC,PKTDAT		; data area pointer
  048          004 047  	MOVEM TAC,PDBPNT(PDB)
  049                   ;	JRST WRPDAT
␈↓&	Output I-level loop                                              DLNSER[S,SYS] 08/14/78  Page 25␈↓'α
  001                   ;WRPDAT WRPMOR WRPBKU
  002                   
  003          004 047  WRPDAT:	ILDB CHR,PDBPNT(PDB)
  004          026 063  	PUSHJ P,CHKBYT
  005          026 012  	JSP TAC,DLNOCH
  006          004 047  	SOSL PDBCNT(PDB)	; data done?
  007          025 003  	 JRST WRPDAT
  008          004 047  	LDB CHR,[001000,,PDBCHK(PDB)] ; LSB of checksum
  009          026 012  	JSP TAC,DLNOCH
  010          004 047  	LDB CHR,[101000,,PDBCHK(PDB)] ; MSB of checksum
  011          026 012  	JSP TAC,DLNOCH
  012          004 007  	MOVEI CHR,%DLE		; all packets end with EOP
  013          026 015  	JSP TAC,DLNOC1		; DLNOC1 skips DLE check
  014          004 009  	MOVEI CHR,%ETX
  015          026 012  	JSP TAC,DLNOCH
  016  DLNDDB  002 028  	AOS NOUPKT(DDB)
  017          024 007  	MOVEI TAC,WRLIST
  018  DLNDDB  002 032  	MOVEM TAC,DODS(DDB)
  019          004 037  	MOVEI TAC,DS%IDL
  020  DLNDDB  002 030  	IORM TAC,DSTAT(DDB)	; note output I-level idle
  021          004 047  	HLRZ TAC,PDBLNK(PDB)	; get previous
  022          025 049  	JUMPN TAC,WRPBKU	; oops!  retransmission time!!!
  023          004 047  	SKIPE TAC,PDBLNK(PDB)
  024          004 049  	 HRRZS PDBLNK(TAC)	; unbind the PDB just output from this one
  025  DLNDDB  002 039  	MOVEM TAC,DOLIST(DDB)	; make it the current
  026          025 035  	JUMPN TAC,WRPMOR	; skip the extra acknowledgement cruft if more
  027          004 041  	MOVEI TAC,DS%ACN
  028  DLNDDB  002 030  	TDNN TAC,DSTAT(DDB)	; if an acknowledgement is needed
  029          025 035  	 JRST WRPMOR
  030          004 047  	PUSH P,PDB
  031          005 025  	PUSHJ P,MAKPDB		; get an empty PDB (which happens to be a NOP)
  032                   	 TRNA
  033  DLNDDB  002 039  	  MOVEM PDB,DOLIST(DDB)	; queue it, which will send an acking NOP!
  034          004 047  	POP P,PDB
  035          004 062  WRPMOR:	LDB TAC,PKTSEQ
  036                   	JUMPE TAC,[	PUSHJ P,DLWAKE ; wake up user
  037                   			PUSHJ P,CLRPDB ; if not to be acknowledged, delete it
  038          024 007  			JRST WRLIST]
  039  DLNDDB  002 040  	MOVE TAC,DXLIST(DDB)	; top of unacknowledged queue
  040          004 047  	HRRZM TAC,PDBLNK(PDB)	; link PDB just output to the top
  041                   	SKIPE TAC
  042          004 049  	 HRLM PDB,PDBLNK(TAC)	; complete the binding
  043  DLNDDB  002 040  	MOVEM PDB,DXLIST(DDB)	; and update the unacknowledged queue
  044          016 047  	PUSHJ P,DLWAKE		; wake up user
  045          024 007  	JRST WRLIST
  046                   
  047                   ; Here to back up in the list when it's retransmission time
  048                   
  049          004 047  WRPBKU:	MOVE PDB,TAC		; make the previous THE current
  050          004 047  	HLRZ TAC,PDBLNK(PDB)
  051          025 049  	JUMPN TAC,WRPBKU
  052  DLNDDB  002 039  	MOVEM PDB,DOLIST(DDB)	; declare this to be the real start of the list
  053          024 009  	JRST WRLSTX
␈↓&	I-level subroutines                                              DLNSER[S,SYS] 08/14/78  Page 26␈↓'α
  001                   ;DLNICH DLNOCH DLNOC1 DLNRCH DLNDIL DLNLGR CHKBYT
  002                   
  003                   SUBTTL I-level subroutines
  004                   
  005                   ; Input a character coroutine
  006                   
  007  DLNDDB  002 031  DLNICH:	MOVEM TAC,DIDS(DDB)	; save PC of caller
  008                   	POPJ P,
  009                   
  010                   ; Output a character coroutine
  011                   
  012          004 042  DLNOCH:	MOVEI TAC1,DS%ODE	; maybe have to do a DLE again?
  013          004 007  	CAIN CHR,%DLE
  014  DLNDDB  002 030  	 IORM TAC1,DSTAT(DDB)	; yes, remember that
  015  DLNDDB  002 032  DLNOC1:	MOVEM TAC,DODS(DDB)	; save PC of caller
  016                   	LDB TAC,PUNIT		; TAC ← Dialnet unit number
  017                   	JRST DLNTYP
  018                   
  019                   ; Get a single byte into DREP in the DDB (for getting a dialing reply)
  020                   
  021  DLNDDB  002 047  DLNRCH:	MOVEM CHR,DREP(DDB)	; save character
  022                   	MOVEI TAC,CPOPJ		; stop I-level
  023  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  024          016 047  	JRST DLWAKE
  025                   
  026                   ; Here to dial phone number
  027                   
  028  DLNDDB  002 046  DLNDIL:	MOVE TAC,[440700,,DNUM(DDB)] ; pointer to phone number
  029  DLNDDB  002 045  	MOVEM TAC,DNUMP(DDB)
  030                   	MOVEI CHR,"α"		; start transaction
  031          026 012  	JSP TAC,DLNOCH
  032  DLNDDB  002 045  	ILDB CHR,DNUMP(DDB)	; get phone number byte
  033          026 012  	JUMPN CHR,[JSP TAC,DLNOCH ↔ JRST .-1]
  034                   	MOVEI CHR,"∂"		; end of buffer
  035          026 012  	JSP TAC,DLNOCH
  036                   	MOVEI CHR,"β"		; start dialing
  037                   	LDB TAC,PUNIT
  038          026 012  	JSP TAC,DLNOCH
  039                   	MOVEI TAC,CPOPJ		; stop output I-level
  040  DLNDDB  002 032  	MOVEM TAC,DODS(DDB)
  041          026 021  	MOVEI TAC,DLNRCH	; and start input
  042  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  043                   	POPJ P,
  044                   
  045                   ; Fire up the Dialnet logger
  046                   
  047                   DLNLGR:	MOVEI TAC,['DLNLGR' ↔ 'NETSYS' ↔ LUPPRV,,]
  048                   	PUSHJ P,FIREUP		; wake up DLNLGR
  049                   	 JRST [	MOVSI TAC,DLNLGR; failed, try again later
  050                   		CONO PI,PIOFF
  051                   		IDPB TAC,CLKQ
  052                   		CONO PI,PION
  053                   		POPJ P,]
  054                   	POPJ P,
  055                   
  056                   ; Add a byte to the checksum in the PDB's PDBCHK
  057                   ; Algorithm: while CHR do SUM ← (SUM*013215) + CHR;
  058                   ;	MOVE CHR,<byte from data stream>
  059                   ;	PUSHJ P,CHKBYT
  060                   ;	<return>
  061                   ; At the beginning of each packet PDBCHK must be initialized to 1.
  062                   
  063          004 047  CHKBYT:	MOVE TAC,PDBCHK(PDB)
  064                   	IMULI TAC,013215	; Dialnet black magic number
  065                   	ADDI TAC,(CHR)
  066          004 047  	HRRZM TAC,PDBCHK(PDB)
  067                   	POPJ P,
␈↓&	I-level subroutines                                              DLNSER[S,SYS] 08/14/78  Page 27␈↓'α
  001                   ;SNDERR SNDERL SNDER1
  002                   
  003                   ; Send an error message to the other place.
  004                   ;	PUSHJ P,SNDERR
  005                   ;	 ASCIZ/...message.../
  006                   ;	<return>
  007                   
  008          004 047  SNDERR:	PUSH P,PDB
  009  DLNDDB  002 042  	SKIPLE DOWIN(DDB)	; make sure the window is open
  010          005 025  	 PUSHJ P,MAKPDB		; get a PDB to frob
  011          027 028  	  JRST SNDER1
  012          004 023  	MOVEI TAC,%ERR		; error type packet
  013          004 061  	DPB TAC,PKTOPC
  014          004 066  	MOVE TAC1,PKTDAT	; pointer to data area
  015                   	SETZ DAT,
  016                   	HRRZ TAC,-1(P)		; addr of string
  017                   	TLOA TAC,440700		; make byte pointer
  018                   SNDERL:	 IDPB CHR,TAC1
  019                   	ILDB CHR,TAC		; gobble down character of message
  020                   	SKIPE CHR
  021          027 018  	 AOJA DAT,SNDERL
  022          004 064  	DPB DAT,PKTSIZ
  023                   	AOS TAC
  024                   	HRRM TAC,-1(P)		; set return PC after the message
  025          017 026  	PUSHJ P,DLOUTQ		; make PDB available for output
  026          004 047  	POP P,PDB
  027                   	POPJ P,
  028                   SNDER1:	HRRZ TAC,-1(P)		; better find that return right!
  029                   	HRLI TAC,440700
  030                   	ILDB CHR,TAC
  031                   	JUMPN CHR,.-1
  032                   	AOS TAC
  033                   	HRRM TAC,-1(P)
  034          004 047  	POP P,PDB
  035                   	POPJ P,
␈↓&	I-level interface with TTYSER                                    DLNSER[S,SYS] 08/14/78  Page 28␈↓'α
  001                   ;DLIINT DLOINT
  002                   
  003                   SUBTTL I-level interface with TTYSER
  004                   
  005                   ;  Input interrupt; device index in TAC, character in CHR.  I hope you have as
  006                   ; much fun reading this routine as I had writing it.
  007                   
  008                   ↑DLIINT:SKIPL TAC		; demand a good index
  009                   	 CAIL TAC,DLNNUM	; 0≤index≤DLNNUM-1
  010          030 027  	  JSP TAC1,BADDLU	; bad Dialnet unit
  011  DLNDDB  002 057  	MOVE DDB,DLNUTB(TAC)	; get DDB
  012  DLNDDB  002 030  	MOVE TAC,DSTAT(DDB)	; get status bits
  013          004 036  	TRNN TAC,DS%IEN		; I-level enabled for this DDB?
  014                   	 POPJ P,
  015  DLNDDB  002 037  	SKIPN PDB,INTPDB(DDB)	; set up packet pointer
  016          004 047  	 MOVEI PDB,654321	; cause immediate exec page fault if losing
  017                   	ANDI CHR,377		; goddamned bagbiting status bits!!
  018          004 038  	TRZE TAC,DS%DLE		; previous character a DLE?
  019          004 039  	 JRST [	TRZE TAC,DS%EOP	; have EOP permission?
  020          004 009  		 CAIE CHR,%ETX	; end of packet
  021          004 011  		  CAIN CHR,%STX	; start of packet
  022          020 005  		   PUSH P,[RDPCKT ↔ RDPDUN]-%STX(CHR) ; knows that ETX = STX +1
  023  DLNDDB  002 030  		MOVEM TAC,DSTAT(DDB) ; set status flags
  024          004 007  		CAIN CHR,%DLE	; quoted DLE?
  025  DLNDDB  002 031  		 JRST @DIDS(DDB)
  026                   		POPJ P,]
  027          004 007  	CAIE CHR,%DLE		; if not DLE
  028          004 039  	 TRZA TAC,DS%EOP	; then deny EOP permission
  029          004 038  	  TROA TAC,DS%DLE	; else set "previous was DLE"
  030  DLNDDB  002 031  	   PUSH P,DIDS(DDB)	; else interpret as normal character
  031  DLNDDB  002 030  	MOVEM TAC,DSTAT(DDB)
  032                   	POPJ P,
  033                   
  034                   ; Output interrupt; device index in TAC
  035                   
  036                   ↑DLOINT:SKIPL TAC		; demand a good index
  037                   	 CAIL TAC,DLNNUM
  038          030 027  	  JSP TAC1,BADDLU
  039  DLNDDB  002 057  	MOVE DDB,DLNUTB(TAC)	; get DDB
  040  DLNDDB  002 030  	MOVE TAC1,DSTAT(DDB)
  041          004 036  	TRNN TAC1,DS%IEN	; flush if locked out
  042                   	 POPJ P,
  043          004 042  	TRZE TAC1,DS%ODE	; time to double a DLE?
  044  DLNDDB  002 030  	 JRST [	MOVEM TAC1,DSTAT(DDB) ; yes, flag it done
  045          004 007  		MOVEI CHR,%DLE
  046                   		JRST DLNTYP]	; and skip the coroutine this time around
  047  DLNDDB  002 039  	SKIPN PDB,DOLIST(DDB)	; set up packet pointer
  048          004 047  	 MOVEI PDB,654321 	; cause immediate exec page fault if losing
  049  DLNDDB  002 032  	JRST @DODS(DDB)		; back to output loop
␈↓&	I-level interface with TTYSER                                    DLNSER[S,SYS] 08/14/78  Page 29␈↓'α
  001                   ;DLPINT DLHINT
  002                   
  003                   ; Pick-up interrupt.  Flag the line as having carrier
  004                   
  005                   ↑DLPINT:SKIPL TAC		; demand a good index
  006                   	 CAIL TAC,DLNNUM
  007          030 027  	  JSP TAC1,BADDLU
  008  DLNDDB  002 057  	MOVE DDB,DLNUTB(TAC)	; get DDB
  009          004 040  	MOVEI TAC,DS%CCR	; flag carrier on this line
  010  DLNDDB  002 030  	IORM TAC,DSTAT(DDB)
  011                   	POPJ P,
  012                   
  013                   ; Hang-up interrupt
  014                   
  015                   ↑DLHINT:SKIPL TAC		; demand a good index
  016                   	 CAIL TAC,DLNNUM
  017          030 027  	  JSP TAC1,BADDLU
  018  DLNDDB  002 057  	MOVE DDB,DLNUTB(TAC)	; get DDB
  019          004 040  	MOVEI TAC,DS%CCR
  020  DLNDDB  002 030  	ANDCAB TAC,DSTAT(DDB)
  021          004 036  	TRNN TAC,DS%IEN		; I-level enabled for this DDB?
  022                   	 POPJ P,
  023                   	MOVEI TAC,CPOPJ
  024  DLNDDB  002 031  	MOVEM TAC,DIDS(DDB)
  025  DLNDDB  002 032  	MOVEM TAC,DODS(DDB)
  026  DLNDDB  002 043  	SETZM DACK(DDB)		; try to avoid packet number lossage
  027  DLNDDB  002 044  	SETZM DSEQ(DDB)
  028  DLNDDB  002 033  	SETZM DPID(DDB)		; clear PID no matter what
  029  DLNDDB  002 033  	SETZM DPID+1(DDB)
  030          005 025  	PUSHJ P,MAKPDB
  031                   	 POPJ P,
  032          004 017  	MOVEI TAC,%CLS		; in case saved in input list
  033          004 061  	DPB TAC,PKTOPC
  034          023 038  	JRST RDPCLS		; and fake having read in a CLS
␈↓&	Bug traps                                                        DLNSER[S,SYS] 08/14/78  Page 30␈↓'α
  001                   ;DLNBUG BADDLU
  002                   
  003                   SUBTTL Bug traps
  004                   
  005                   ; Here to report a Dialnet bug
  006                   ;	<bug trap instruction, skip if no bug>
  007                   ;	 PUSHJ P,DLNBUG
  008                   ; Re-executes the losing instruction
  009                   
  010                   DLNBUG:	SOS (P)			; make it come back to the instruction
  011                   	SOS (P)			; which screwed us, so CPOPJ$G will retry
  012                   	PUSHACS
  013                   	PUSHJ P,DISDATE
  014                   	PUSHJ P,DISERR
  015                   	 [ASCIZ/DIALNET BUG TRAP AT /]
  016                   	 DISARG LOC,<-21(P)>
  017                   	 [ASCIZ/.  FIND MRC BEFORE DOING ANYTHING.
  018                   /]
  019                   	 -1
  020                   	PUSHJ P,DISFLUSH
  021                   	POPACS
  022                   	JRST WDDTCAL
  023                   
  024                   ;  Here when Brian bit the bag and gave us a bad index, called via
  025                   ; JSP TAC1,BADDLU with losing index in TAC.
  026                   
  027                   ↑BADDLU:PUSHACS
  028                   	PUSHJ P,DISDATE
  029                   	PUSHJ P,DISERR
  030          030 032  	 [ASCIZ/ILLEGAL DIALNET INDEX AT I-LEVEL, CALLER=/]
  031                   	 DISARG LOC,<-20+TAC1(P)>
  032                   	 [ASCIZ/, INDEX=/]
  033                   	 DISARG LOC,<-20+TAC(P)>
  034                   	 [ASCIZ/
  035                   /]
  036                   	 -1
  037                   	PUSHJ P,DISFLUSH
  038                   	POPACS
  039                   	JRST WDDTCAL
  040                   
  041                   >; IFN FTDLN
  042                   
  043          002 001  BEND DLNSER
Symbol Table for:    DLNSER[S,SYS]                                           08/14/78  Page I
                     

%CLS   ← 004 017   DLIEOF   009 041   DLNOC1   026 015   DS%CON ← 004 035   PDFILL   005 043   RDPNRT   020 049 
%DLE   ← 004 007   DLIINR   009 040   DLNOCH   026 012   DS%DLE ← 004 038   PKTACK   004 063   RDPPAK   021 005 
%EOF   ← 004 021   DLIINT   028*008   DLNOUT   010 012   DS%EOP ← 004 039   PKTCHN   004 060   RDPPK0   021 018 
%ERR   ← 004 023   DLILUP   008 022   DLNRCH   026 021   DS%IDL ← 004 037   PKTCOP   004 059   RDPRPC   023 005 
%ETX   ← 004 009   DLIMSG   009 007   DLNRLS   007 028   DS%IEN ← 004 036   PKTDAT   004 066   RDPSIW   020 009 
%INT   ← 004 022   DLMLUP   009 011   DLNRPA   013 014   DS%ODE ← 004 042   PKTFDA   004 067   RDPWIN   022 021 
%MSG   ← 004 019   DLNBUG   030 010   DLNRPC   012 014   DXHANG   016 007   PKTOPC   004 061   RDPWN1   022 022 
%NAK   ← 004 020   DLNCL1   018 015   DLNRWN   013 029   FLSPDB   006 039   PKTSDA   004*068   RDRPC2   023 031 
%NOP   = 004*025   DLNCL2   018 038   DLNSER B 002 001   GETARG   017 006   PKTSEQ   004 062   REPFLX   005 056 
%NOP   ← 004*015   DLNCLK   018 010   DLNSTA   015 035   INDEX  = 030 032   PKTSIZ   004 064   REPFPL   005 050 
%RPC   ← 004 016   DLNCLS   014 010   DLNWIN   014 035   INTTAB   021 037   PKTWNS   004 070   REVPDB   022 052 
%STX   = 004 011   DLNCWA   015 054   DLOINT   028*036   MAKPD1   005 034   RDPCKN   020 030   SNDER1   027 028 
%STX   ← 004 008   DLNDIL   026 028   DLOLUP   010 036   MAKPD2   005 039   RDPCKT   019 008   SNDERL   027 018 
%WIN   ← 004 018   DLNDSP   002*016   DLONEW   010*021   MAKPDB   005 025   RDPCKX   019 013   SNDERR   027 008 
BADDLU   030 027   DLNEOF   014 056   DLOOLD   010 032   NORPC    017 016   RDPCL1   023 047   SNDNOP   013*005 
CALLER = 030*030   DLNICH   026 007   DLOOUT   010 055   OPMAX  ← 008 049   RDPCLS   023 038   UUOTAB   008 040 
CHKBYT   026 063   DLNIN1   007 014   DLOOUX   010 064   PDB    ← 004 047   RDPDAT   019 030   WINDEF ← 004 030 
CLRPDB   006 009   DLNINI   007 007   DLOUQ1   017 033   PDBCHK ← 004 052   RDPDUN   020 005   WINMAX ← 004 031 
DCHLUZ   017 021   DLNINP   008 016   DLOUTQ   017 026   PDBCNT ← 004 050   RDPERR   022 070   WINMIN ← 004 029 
DCWAIT   016 026   DLNINT   015 009   DLPINT   029*005   PDBDAT ← 004 054   RDPFAK   020 017   WRLIST   024 007 
DCWAKE   016 045   DLNLGR   026 047   DLRCON   012 027   PDBGET   005 010   RDPINT   022 037   WRLSTX   024 009 
DLDINI   007 043   DLNMDS   011 010   DLWAIT   016 032   PDBHDR ← 004 053   RDPMSG   022 005   WRPBKU   025 049 
DLHANG   016 013   DLNMMX ← 011 018   DLWAKE   016 047   PDBLNK ← 004 049   RDPNAK   022 048   WRPDAT   025 003 
DLHINT   029*015   DLNMSG M 003 010   DS%ACN ← 004 041   PDBPNT ← 004 051   RDPNOP   021 031   WRPMOR   025 035 
DLICLS   009 028   DLNMTP   011 005   DS%CCR ← 004 040   PDBSIZ ← 004 055   RDPNPK   021 017   WRPSOP   024 025 
DLIDSC   008 031   
SAIL MRC        09:05:20 Monday, August 14, 1978   FQ+3D.9H.17M.25S.
DLNDDB[S,SYS] Created 00:30 Sunday, August 13, 1978   FQ+2D.0H.42M.5S.

DDDDDDDDD            LLL                  NNN         NNN      DDDDDDDDD            DDDDDDDDD            BBBBBBBBBBBB   
DDDDDDDDD            LLL                  NNN         NNN      DDDDDDDDD            DDDDDDDDD            BBBBBBBBBBBB   
DDDDDDDDD            LLL                  NNN         NNN      DDDDDDDDD            DDDDDDDDD            BBBBBBBBBBBB   
DDD      DDD         LLL                  NNNNNN      NNN      DDD      DDD         DDD      DDD         BBB         BBB
DDD      DDD         LLL                  NNNNNN      NNN      DDD      DDD         DDD      DDD         BBB         BBB
DDD      DDD         LLL                  NNNNNN      NNN      DDD      DDD         DDD      DDD         BBB         BBB
DDD         DDD      LLL                  NNN   NNN   NNN      DDD         DDD      DDD         DDD      BBB         BBB
DDD         DDD      LLL                  NNN   NNN   NNN      DDD         DDD      DDD         DDD      BBB         BBB
DDD         DDD      LLL                  NNN   NNN   NNN      DDD         DDD      DDD         DDD      BBB         BBB
DDD         DDD      LLL                  NNN      NNNNNN      DDD         DDD      DDD         DDD      BBBBBBBBBBBB   
DDD         DDD      LLL                  NNN      NNNNNN      DDD         DDD      DDD         DDD      BBBBBBBBBBBB   
DDD         DDD      LLL                  NNN      NNNNNN      DDD         DDD      DDD         DDD      BBBBBBBBBBBB   
DDD         DDD      LLL                  NNN         NNN      DDD         DDD      DDD         DDD      BBB         BBB
DDD         DDD      LLL                  NNN         NNN      DDD         DDD      DDD         DDD      BBB         BBB
DDD         DDD      LLL                  NNN         NNN      DDD         DDD      DDD         DDD      BBB         BBB
DDD      DDD         LLL                  NNN         NNN      DDD      DDD         DDD      DDD         BBB         BBB
DDD      DDD         LLL                  NNN         NNN      DDD      DDD         DDD      DDD         BBB         BBB
DDD      DDD         LLL                  NNN         NNN      DDD      DDD         DDD      DDD         BBB         BBB
DDDDDDDDD            LLLLLLLLLLLLLLL      NNN         NNN      DDDDDDDDD            DDDDDDDDD            BBBBBBBBBBBB   
DDDDDDDDD            LLLLLLLLLLLLLLL      NNN         NNN      DDDDDDDDD            DDDDDDDDD            BBBBBBBBBBBB   
DDDDDDDDD            LLLLLLLLLLLLLLL      NNN         NNN      DDDDDDDDD            DDDDDDDDD            BBBBBBBBBBBB   

SAIL MRC        09:05:20 Monday, August 14, 1978   FQ+3D.9H.17M.25S.
DLNDDB[S,SYS] Created 00:30 Sunday, August 13, 1978   FQ+2D.0H.42M.5S.

               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

DLNSER[S,SYS]          DLNDDB[S,SYS]


Switch Settings: L[FAIL] % C S 78V 120W X ↑ 
Fonts: F[FIX20.FNT[XGP,SYS],,] 

                                                                         ␈↓&DLNDDB[S,SYS] 08/14/78  Page 1␈↓'α
  001                   COMMENT ⊗   VALID 00002 PAGES
  002                   C REC  PAGE   DESCRIPTION
  003                   C00001 00001
  004                   C00002 00002	BEGIN DLNDDB ↔ SUBTTL DLNDDB Dialnet DDB and Data Area
  005                   C00006 ENDMK
  006                   C⊗;
                                                                         ␈↓&DLNDDB[S,SYS] 08/14/78  Page 2␈↓'α
  001                   BEGIN DLNDDB ↔ SUBTTL DLNDDB Dialnet DDB and Data Area
  002                   ; Mark Crispin, August '78
  003                   
  004                   .AUXIL
  005                   
  006                   IFN FTDLN,<
  007                   
  008                   ; DDB for DLN device
  009                   
  010                   GLOBAL LPTDDB
  011          002 010  DLINK←←LPTDDB			; link to LPT
  012                   UNIT←←DLNNUM			; initialize unit counter
  013                   
  014                   DEFINE DEV'(X)<IFE X,<↑DLNDDB:>↑DL'X'DDB:IFN DLNNUM-1,<SIXBIT/DLN'X/;>SIXBIT/DLN/>
  015                   DEFINE DLNUTX'(X)<DL'X'DDB>
  016                   
  017                   REPEAT DLNNUM,<
  018          002 012  UNIT←←UNIT-1
  019                   	DEVIBF,,0		; DEVCMR
  020          002 012  	DEV(\UNIT)		; DEVNAM
  021          002 012  	UNIT⊗PUNITP		; DEVCHR
  022                   	0			; DEVIOS
  023  DLNSER  002 016  	DLINK,,DLNDSP		; DEVSER
  024                   	DVLNG!DVIN!DVOUT,,100000; DEVMOD
  025                   	BLOCK 4			; DEVLOG/DEVBUF/DEVIAD/DEVOAD
  026                   	PHASE DEVOAD+1
  027                   ↑NINPKT:BLOCK 1			; # of packets read
  028                   ↑NOUPKT:BLOCK 1			; # of packets sent
  029                   ↑DFWC←←.			; first word cleared at DLDINI
  030                   ↑DSTAT:	BLOCK 1			; status bits (first word zeroed at DDB init)
  031                   ↑DIDS:	BLOCK 1			; I-level input coroutine PC
  032                   ↑DODS:	BLOCK 1			; I-level output coroutine PC
  033                   ↑DPID:	BLOCK 2			; Dialnet PID
  034                   ↑DIWS:	BLOCK 1			; input window size
  035                   ↑DOWS:	BLOCK 1			; output window size (must be after DIWS)
  036                   ↑UUOPDB:BLOCK 1			; UUO PDB
  037                   ↑INTPDB:BLOCK 1			; I-level PDB
  038                   ↑DILIST:BLOCK 1			; input PDB list
  039                   ↑DOLIST:BLOCK 1			; output PDB list
  040                   ↑DXLIST:BLOCK 1			; acknowledgement pending PDB list
  041                   ↑DIWIN:	BLOCK 1			; input window free
  042                   ↑DOWIN:	BLOCK 1			; output window free (must be after DIWIN)
  043                   ↑DACK:	BLOCK 1			; last consecutive packet received
  044                   ↑DSEQ:	BLOCK 1			; current output packet sequence number
  045                   ↑DNUMP:	BLOCK 1			; pointer to phone number
  046                   ↑DNUM:	BLOCK 4			; phone number
  047                   ↑DREP:	BLOCK 1			; dialing reply
  048                   ↑DLWC←←.-1			; last word cleared at DLDINI
  049                   	DEPHASE
  050          002 012  DLINK←←DLNUTX(\UNIT)
  051                   >
  052                   
  053          002 048  ↑DLNDLN←←DLWC+2			; size of DDB
  054                   
  055                   ; Unit/DDB conversion table for I-level routines.
  056                   
  057          002 012  ↑DLNUTB:REPEAT DLNNUM,<DLNUTX(\UNIT) ↔ UNIT←←UNIT+1>
  058                   
  059                   ; PDB free list stuff
  060                   
  061                   ↑PDBFL:	BLOCK 1			; PDB free list
  062                   ↑PDBFLN:BLOCK 1			; < 0 → number of PDB's PDBFL wants to get
  063                   				; = 0 → PDBFL is content
  064                   				; > 0 → number to drop (can be caused by
  065                   				;       timing errors)
  066                   >;IFN FTDLN
  067                   
  068          002 001  BEND DLNDDB
Symbol Table for:    DLNDDB[S,SYS]                                           08/14/78  Page I
                     

DACK     002 043   DIWS     002 034   DLNUTX M 002 015   DOWIN    002 042   DXLIST   002 040   PDBFLN   002 062 
DEV    M 002 014   DLINK  ← 002 011   DLWC   ← 002 048   DOWS     002 035   INTPDB   002 037   UNIT   ← 002 012 
DFWC   ← 002 029   DLINK  ← 002 050   DNUM     002 046   DPID     002 033   LPTDDB G 002 010   UNIT   ← 002 018 
DIDS     002 031   DLNDDB B 002 001   DNUMP    002 045   DREP     002 047   NINPKT   002 027   UNIT   ← 002 057 
DILIST   002 038   DLNDLN ← 002*053   DODS     002 032   DSEQ     002 044   NOUPKT   002 028   UUOPDB   002 036 
DIWIN    002 041   DLNUTB   002 057   DOLIST   002 039   DSTAT    002 030   PDBFL    002 061   
Cref of:    DLNSER[S,SYS]            DLNDDB[S,SYS]                                           08/14/78  Page I
            

Key to types of symbol occurrences (Note references come last):

Dash - Reference.  : - Label.  ← - Assignment.
= - OPDEF or SYN.  + - Macro.  * - Block.  # - Variable.  ↑ - Global.


%CLS	  DLNSER 004←017 014-018 029-032
%DLE	  DLNSER 004←007 024-027 025-012 026-013 028-024 028-027 028-045
%EOF	  DLNSER 004←021 014-068
%ERR	  DLNSER 004←023 017-028 024-017 027-012
%ETX	  DLNSER 004←009 004-011 004-011 025-014 028-020
%INT	  DLNSER 004←022 015-020
%MSG	  DLNSER 004←019 010-030
%NAK	  DLNSER 004←020 017-029 020-046 024-018
%NOP	  DLNSER 004=025 004←015
%RPC	  DLNSER 004←016 013-019
%STX	  DLNSER 004=011 004←008 024-029 028-021 028-022
%WIN	  DLNSER 004←018 014-039
BADDLU	  DLNSER 030:027 028-010 028-038 029-007 029-017
CALLER	  DLNSER 030=030
CHKBYT	  DLNSER 026:063 019-016 019-019 019-022 019-025 019-031 024-032 024-035 024-039 024-044 025-004
CLRPDB	  DLNSER 006:009 006-041 007-011 007-036 007-038 008-036 010-061 010-068 019-049 020-027 021-032 022-049 023-052
	 023-053
DACK	  DLNDDB 002:043  DLNSER 020-033 021-005 024-037 029-026
DCHLUZ	  DLNSER 017:021 014-058 015-011
DCWAIT	  DLNSER 016:026 012-041
DCWAKE	  DLNSER 016:045 016-028
DEV	  DLNDDB 002+014 002-020
DFWC	  DLNDDB 002←029  DLNSER 007-051 007-052 007-053
DIDS	  DLNDDB 002:031  DLNSER 007-061 012-045 019-047 020-010 026-007 026-023 026-042 028-025 028-030 029-024
DILIST	  DLNDDB 002:038  DLNSER 007-029 008-022 008-034 022-011 022-015
DIWIN	  DLNDDB 002:041  DLNSER 007-059 008-031 013-038 020-006 021-031 022-048
DIWS	  DLNDDB 002:034  DLNSER 007-058 013-035 013-036 014-046 014-047 015-039
DLDINI	  DLNSER 007:043 007-016
DLHANG	  DLNSER 016:013 008-023 010-040
DLHINT	  DLNSER 029:015
DLICLS	  DLNSER 009:028 008-042
DLIDSC	  DLNSER 008:031 009-014 009-023 009-035 009-045
DLIEOF	  DLNSER 009:041 008-046
DLIINR	  DLNSER 009:040 008-047
DLIINT	  DLNSER 028:008
DLILUP	  DLNSER 008:022 009-016
DLIMSG	  DLNSER 009:007 008-044
DLINK	  DLNDDB 002←011 002←050 002-023
DLMLUP	  DLNSER 009:011 009-019
DLNBUG	  DLNSER 030:010 006-010 006-012 006-016 007-010 008-027 010-022 012-038 013-006 013-009 013-018 014-017 014-038
	 014-066 015-018 017-032 018-022 021-014 024-011
DLNCL1	  DLNSER 018:015 018-039
DLNCL2	  DLNSER 018:038 018-020 018-027 018-029
DLNCLK	  DLNSER 018:010 007-020
DLNCLS	  DLNSER 014:010 002-017 009-029 011-011
DLNCWA	  DLNSER 015:054 011-017 015-061
DLNDDB	  DLNDDB 002*001 002-068
DLNDIL	  DLNSER 026:028 012-057
DLNDLN	  DLNDDB 002←053
DLNDSP	  DLNSER 002:016  DLNDDB 002-023
DLNEOF	  DLNSER 014:056 011-013
DLNICH	  DLNSER 026:007 019-015 019-018 019-021 019-024 019-030 019-037 019-039 019-045
DLNIN1	  DLNSER 007:014 007-018
DLNINI	  DLNSER 007:007 002-014
DLNINP	  DLNSER 008:016 002-023
DLNINT	  DLNSER 015:009 011-014
DLNLGR	  DLNSER 026:047 023-031
DLNMDS	  DLNSER 011:010 011-008 011-018
DLNMMX	  DLNSER 011←018 011-006
DLNMSG	  DLNSER 003+010 020-008 021-028 022-007 022-024 022-070 023-007 023-021 023-026
DLNMTP	  DLNSER 011:005 002-030
DLNOC1	  DLNSER 026:015 024-028 025-013
DLNOCH	  DLNSER 026:012 012-047 024-030 024-033 024-036 024-042 024-046 025-005 025-009 025-011 025-015 026-031 026-033
	 026-035 026-038
DLNOUT	  DLNSER 010:012 002-022
DLNRCH	  DLNSER 026:021 012-044 026-041
DLNRLS	  DLNSER 007:028 002-016 023-054
DLNRPA	  DLNSER 013:014 012-023 012-031
DLNRPC	  DLNSER 012:014 011-010
Cref of:    DLNSER[S,SYS]            DLNDDB[S,SYS]                                           08/14/78  Page II

DLNRWN	  DLNSER 013:029 013-027
DLNSER	  DLNSER 002*001 004-011 004-025 030-043
DLNSTA	  DLNSER 015:035 011-016
DLNUTB	  DLNDDB 002:057  DLNSER 007-014 016-046 018-015 028-011 028-039 029-008 029-018
DLNUTX	  DLNDDB 002+015 002-050 002-057
DLNWIN	  DLNSER 014:035 011-012
DLOINT	  DLNSER 028:036
DLOLUP	  DLNSER 010:036 010-047
DLONEW	  DLNSER 010:021
DLOOLD	  DLNSER 010:032 010-020
DLOOUT	  DLNSER 010:055 011-015 014-013 014-062
DLOOUX	  DLNSER 010:064 010-041
DLOUQ1	  DLNSER 017:033 017-027 017-030
DLOUTQ	  DLNSER 017:026 010-070 013-007 013-010 013-039 014-022 014-048 014-070 015-022 018-028 020-048 027-025
DLPINT	  DLNSER 029:005
DLRCON	  DLNSER 012:027 012-021
DLWAIT	  DLNSER 016:032 012-048 012-058 015-060 016-009 016-021
DLWAKE	  DLNSER 016:047 021-033 022-017 022-051 022-063 022-066 025-044 026-024
DLWC	  DLNDDB 002←048  DLNSER 007-054  DLNDDB 002-053
DNUM	  DLNDDB 002:046  DLNSER 012-054 012-056 015-041 015-043 026-028
DNUMP	  DLNDDB 002:045  DLNSER 026-029 026-032
DODS	  DLNDDB 002:032  DLNSER 007-062 025-018 026-015 026-040 028-049 029-025
DOLIST	  DLNDDB 002:039  DLNSER 007-031 017-033 017-037 018-021 018-035 021-013 021-015 022-060 022-061 024-007 025-025
	 025-033 025-052 028-047
DOWIN	  DLNDDB 002:042  DLNSER 010-039 010-062 013-015 014-014 014-035 014-063 015-015 017-031 020-028 020-043 022-032
	 027-009
DOWS	  DLNDDB 002:035  DLNSER 022-029 022-030
DPID	  DLNDDB 002:033  DLNSER 009-031 009-032 010-015 010-016 010-057 010-058 012-018 013-028 014-023 014-025 015-037
	 015-057 015-058 023-012 023-013 023-019 023-020 023-030 023-050 023-051 029-028 029-029
DREP	  DLNDDB 002:047  DLNSER 012-049 012-059 026-021
DS%ACN	  DLNSER 004←041 021-006 024-040 025-027
DS%CCR	  DLNSER 004←040 012-032 018-019 021-023 029-009 029-019
DS%CON	  DLNSER 004←035 008-016 010-012 012-014 013-025 014-010 014-020 014-059 015-012 015-054 016-015 022-005 023-005
	 023-014 023-047
DS%DLE	  DLNSER 004←038 028-018 028-029
DS%EOP	  DLNSER 004←039 019-042 028-019 028-028
DS%IDL	  DLNSER 004←037 007-063 012-036 017-041 018-018 021-009 024-009 025-019
DS%IEN	  DLNSER 004←036 007-063 028-013 028-041 029-021
DS%ODE	  DLNSER 004←042 026-012 028-043
DSEQ	  DLNDDB 002:044  DLNSER 024-020 024-024 029-027
DSTAT	  DLNDDB 002:030  DLNSER 007-028 007-064 008-017 010-013 012-015 012-033 012-037 013-026 014-011 014-021 014-060
	 015-013 015-035 015-055 016-016 017-042 018-017 019-044 021-007 021-010 021-024 022-006 023-006 023-015 023-018
	 023-048 024-010 024-012 024-041 025-020 025-028 026-014 028-012 028-023 028-031 028-040 028-044 029-010 029-020
DXHANG	  DLNSER 016:007 010-063 013-016 014-015 014-024 014-026 014-036 014-064 015-016
DXLIST	  DLNDDB 002:040  DLNSER 007-033 018-024 018-034 020-015 020-024 022-050 022-056 022-058 022-059 025-039 025-043
FLSPDB	  DLNSER 006:039 006-040 007-030 007-032 007-034
GETARG	  DLNSER 017:006 008-019 009-015 010-032 010-042
INDEX	  DLNSER 030=032 030-030
INTPDB	  DLNDDB 002:037  DLNSER 007-037 019-008 019-012 019-048 020-011 028-015
INTTAB	  DLNSER 021:037 021-027 021-047 021-047
LPTDDB	  DLNDDB 002↑010 002-011
MAKPD1	  DLNSER 005:034 005-038
MAKPD2	  DLNSER 005:039 005-035
MAKPDB	  DLNSER 005:025 007-009 010-021 013-005 013-008 013-017 014-016 014-037 014-065 015-017 018-026 019-010 020-044
	 021-011 025-031 027-010 029-030
NINPKT	  DLNDDB 002:027  DLNSER 020-005
NORPC	  DLNSER 017:016 008-018 010-014 014-061 015-014
NOUPKT	  DLNDDB 002:028  DLNSER 025-016
OPMAX	  DLNSER 008←049 008-025 021-026 021-047
PDB	  DLNSER 004←047 003-024 003-024 004-059 004-060 004-061 004-062 004-063 004-064 004-066 004-067 004-068 004-070
	 005-013 005-014 005-015 005-016 005-026 005-034 005-036 005-037 005-043 005-045 005-057 005-058 006-009 006-011
	 006-014 006-023 006-029 006-030 006-031 006-032 006-034 006-039 006-040 006-042 007-029 007-031 007-033 007-035
	 007-037 008-022 008-033 009-011 009-017 009-022 009-028 009-030 010-019 010-023 010-027 010-029 010-036 010-046
	 010-050 010-055 010-066 010-067 013-029 016-034 016-040 017-038 017-039 018-024 018-030 018-031 018-035 019-008
	 019-012 019-014 019-027 019-029 019-032 019-033 019-036 019-038 019-041 020-012 020-015 020-019 020-019 020-020
	 020-022 020-026 020-029 020-030 020-042 020-049 021-008 021-015 021-017 021-019 021-022 022-014 022-016 022-050
	 022-052 022-053 022-053 022-054 022-056 022-057 022-061 023-011 024-007 024-026 024-045 024-048 025-003 025-006
	 025-008 025-010 025-021 025-023 025-030 025-033 025-034 025-040 025-042 025-043 025-049 025-050 025-052 026-063
	 026-066 027-008 027-026 027-034 028-015 028-016 028-047 028-048
PDBCHK	  DLNSER 004←052 004-053 019-014 019-036 019-038 019-041 024-026 025-008 025-010 026-063 026-066
PDBCNT	  DLNSER 004←050 004-051 009-011 009-022 010-027 010-036 010-050 010-066 010-067 019-027 019-033 021-022 024-045
	 025-006
PDBDAT	  DLNSER 004←054 004-055 004-066 004-067 004-068 004-070 013-029 023-011
PDBFL	  DLNDDB 002:061  DLNSER 005-026 005-033 005-057 005-058
PDBFLN	  DLNDDB 002:062  DLNSER 005-030 005-041 005-060 006-021 007-008
PDBGET	  DLNSER 005:010 005-028 005-050
Cref of:    DLNSER[S,SYS]            DLNDDB[S,SYS]                                           08/14/78  Page III

PDBHDR	  DLNSER 004←053 004-054 004-059 004-060 004-061 004-062 004-063 004-064
PDBLNK	  DLNSER 004←049 004-050 008-033 008-035 018-030 018-031 018-033 020-019 020-022 020-025 020-026 022-012 022-014
	 022-016 022-052 022-053 022-057 022-064 022-065 025-021 025-023 025-024 025-040 025-042 025-050
PDBPNT	  DLNSER 004←051 004-052 009-017 010-029 010-046 019-029 019-032 021-019 024-048 025-003
PDBSIZ	  DLNSER 004←055 005-010 005-016 006-032
PDFILL	  DLNSER 005:043 005-032
PKTACK	  DLNSER 004:063 019-023 020-013 024-038
PKTCHN	  DLNSER 004:060 009-007 009-043 010-025 010-034 014-067 015-019
PKTCOP	  DLNSER 004:059 019-017 024-031
PKTDAT	  DLNSER 004:066 010-028 019-028 021-018 022-070 024-047 027-014
PKTFDA	  DLNSER 004:067 014-045 022-021
PKTOPC	  DLNSER 004:061 008-024 010-031 013-020 014-019 014-040 014-069 015-021 017-026 020-047 021-025 024-015 027-013
	 029-033
PKTSDA	  DLNSER 004:068
PKTSEQ	  DLNSER 004:062 019-020 020-017 020-031 024-013 024-023 024-034 025-035
PKTSIZ	  DLNSER 004:064 010-069 013-022 019-026 021-020 024-043 027-022
PKTWNS	  DLNSER 004:070 013-034 023-032
RDPCKN	  DLNSER 020:030 020-014 020-016 020-021
RDPCKT	  DLNSER 019:008 028-022
RDPCKX	  DLNSER 019:013 019-009
RDPCL1	  DLNSER 023:047 023-039 023-044
RDPCLS	  DLNSER 023:038 021-039 029-034
RDPDAT	  DLNSER 019:030 019-034
RDPDUN	  DLNSER 020:005 028-022
RDPERR	  DLNSER 022:070 021-045
RDPFAK	  DLNSER 020:017 020-020
RDPINT	  DLNSER 022:037 021-044
RDPMSG	  DLNSER 022:005 021-041 021-043 022-038 022-041 022-044 023-049
RDPNAK	  DLNSER 022:048 021-042
RDPNOP	  DLNSER 021:031 020-041 020-050 021-037 022-010 022-033 022-071 023-010 023-024 023-029 023-033
RDPNPK	  DLNSER 021:017 021-012
RDPNRT	  DLNSER 020:049 020-045
RDPPAK	  DLNSER 021:005 020-038
RDPPK0	  DLNSER 021:018 020-032
RDPRPC	  DLNSER 023:005 021-038
RDPSIW	  DLNSER 020:009 020-007
RDPWIN	  DLNSER 022:021 021-040
RDPWN1	  DLNSER 022:022 023-034
RDRPC2	  DLNSER 023:031 023-017
REPFLX	  DLNSER 005:056 006-033
REPFPL	  DLNSER 005:050 005-044 005-061
REVPDB	  DLNSER 022:052 022-054
SNDER1	  DLNSER 027:028 027-011
SNDERL	  DLNSER 027:018 027-021
SNDERR	  DLNSER 027:008 021-029 022-008 022-025 023-008 023-022 023-027
SNDNOP	  DLNSER 013:005
UNIT	  DLNDDB 002←012 002←018 002←057 002-018 002-020 002-021 002-050 002-057 002-057
UUOPDB	  DLNDDB 002:036  DLNSER 007-035 010-019 010-023 010-055 010-060 010-064
UUOTAB	  DLNSER 008:040 008-026 008-049
WINDEF	  DLNSER 004←030 013-033 014-044
WINMAX	  DLNSER 004←031 013-032 014-043 022-023
WINMIN	  DLNSER 004←029 007-056 007-057 013-031 014-042 022-022
WRLIST	  DLNSER 024:007 025-017 025-038 025-045
WRLSTX	  DLNSER 024:009 017-044 018-037 021-016 022-062 025-053
WRPBKU	  DLNSER 025:049 025-022 025-051
WRPDAT	  DLNSER 025:003 025-007
WRPMOR	  DLNSER 025:035 025-026 025-029
WRPSOP	  DLNSER 024:025 024-014 024-016 024-019